Puis-je trouver la largeur de la console avec Java?

y a-t-il un moyen de trouver la largeur de la console dans laquelle mon programme Java tourne?

j'aimerais que ce soit une plateforme croisée si possible...

Je n'ai aucun désir de changer la largeur du tampon ou de la fenêtre, je veux juste connaître sa largeur afin de pouvoir formater correctement le texte qui est imprimé à l'écran.

30
demandé sur masher 2009-08-17 10:36:48

7 réponses

Il n'y a pas fiable solutions multiplateformes à ce problème. En effet, il y a des situations où il n'est pas possible de savoir quelle est la largeur réelle de la console.

par exemple, sur un système Linux, vous pouvez généralement trouver les dimensions théoriques du terminal à partir des variables D'environnement des lignes et des colonnes. Bien que ces variables soient mises à jour automatiquement lorsque vous redimensionnez certaines fenêtres "émulateur de terminal", ce n'est pas toujours le cas. En effet, dans le cas d'un console distante connectée via le protocole telnet, il n'y a aucun moyen d'obtenir les dimensions réelles du terminal de l'interpréteur de commandes de l'utilisateur.

EDIT: juste pour ajouter que si l'utilisateur change les dimensions de son xterm sur Linux après avoir lancé une application Java, L'application Java ne sera pas notifiée, et il ne verra pas les nouvelles dimensions reflétées dans sa copie des variables D'environnement lignes et colonnes!

EDIT 2: Mon erreur, ils sont bash variables shell, mais ne sont pas exportés à l'environnement par défaut. Vous pouvez "corriger" cela en exécutant export COLUMNS LINES avant de lancer votre application Java.

24
répondu Stephen C 2014-07-29 00:28:58

en fait, une bibliothèque Java existe déjà pour faire cela en Java:JLine 2. (Il y a une ancienne version sur SourceForce, mais ce lien vers GitHub semble être le dernier.)

cela a fonctionné pour moi sous Linux (Mint 14) et Windows (Je ne sais pas quelle version), en utilisant JLine 2.11:

terminalWidth = jline.TerminalFactory.get().getWidth();

JLine promet de travailler sur Mac, aussi.

j'ai trouvé qu'il retourne mauvais largeurs (comme 1!) sous la console Eclipse (mais même la Console native de Java ça ne marche pas sous Eclipse!), et, malheureusement, sous Cygwin. Mais j'ai travaillé autour de cela avec le code qui vérifie les valeurs déraisonnables (< 10) et n'utilise que 80 dans ces cas.

mise à Jour pour JLine 3 (pour Marque-merci, mon ami!):

terminalWidth = org.jline.terminal.TerminalBuilder.terminal().getWidth()
16
répondu Michael Scheper 2018-07-08 23:46:29

Edit: voir le commentaire de @dave_thompson_085 sur ProcessBuilder, comme c'est presque certainement une bien meilleure approche.

une Autre réponse mentionné running tput cols dans un script avant de commencer votre commande. Mais si vous voulez exécuter cela après que Java a déjà commencé, utilisez Runtime.getRuntime().exec(), vous constaterez que tput ne peut pas parler à votre terminal, parce que Java a redirigé stdout et stderr. Comme une solution pas-du-tout-portable, vous pouvez utiliser la magie /dev/tty dispositif, qui se réfère au terminal de le processus actuel. Qui vous permet d'exécuter quelque chose comme ceci:

Process p = Runtime.getRuntime().exec(new String[] {
    "bash", "-c", "tput cols 2> /dev/tty" });
// Read the output of this process to get your terminal width

cela fonctionne pour moi sur Linux, mais je ne m'attendrais pas à ce que cela fonctionne partout. Il faut espérer travailler sur Mac. Ça ne marchera pas sur Windows, même si ça peut marcher avec Cygwin.

8
répondu Jack O'Connor 2017-09-11 21:28:36

Java 6 a une classe java.io.Console, mais il manque malheureusement les fonctionnalités que vous demandez. Obtenir la largeur de fenêtre de la console n'est pas possible avec la bibliothèque Java standard et Java pur, multiplate-forme.

Voici une alternative console Java library qui vous permet d'obtenir la taille de l'écran, mais il inclut une DLL spécifique à Windows. Vous pourriez être en mesure de prendre le code source et compiler la partie C dans une bibliothèque partagée Linux ou Mac OS X, de sorte qu'il va travailler sur ces plates-formes.

4
répondu Jesper 2009-08-17 07:22:38

j'ai déjà travaillé sur ce problème. Je utiliser un couple de différentes techniques. Cependant, il est difficile d'avoir une solution vraiment multiplateformes.

j'ai essayé de faire essayer quelque chose comme cela:

String os = System.getProperty("os.name").toLowerCase();

    //Windows
    if(os.contains("win")){
        System.out.append("Windows Detected");
        //set Windows Dos Terminal width 80, height 25
        Process p = Runtime.getRuntime().exec("mode 80, 25");
    }
    //Mac
    if(os.contains("mac")){
        System.out.println("Macintosh Detected");
        //... I dont know...try Google
    }
    //Linux
    if(os.contains("linux")){
        System.out.println("Linux Detected");

vous pouvez lire / tester et ajouter "export colonnes" à la .fichier bashrc dans tous les répertoires des utilisateurs de Linux avec la chaîne de caractères.contient la méthode ("exporter les colonnes") et l'utilisateur.dir de la propriété.

cela vous permettrait d'obtenir les colonnes à charger chaque le temps de l'application java démarre.

alors je le passerais à un fichier temporaire. Comme ceci:

try {
    ProcessBuilder pb = new ProcessBuilder("bash","-c","echo $COLUMNS >/home/$USER/bin/temp.txt" );  
        pb.start();

    }catch (Exception e) {
        System.out.println("exception happened - here's what I know: ");
        e.printStackTrace();
        System.exit(-1);
    }
}

une autre option que vous avez est d'exécuter yor Java.jar avec un script bash au démarrage. Dans le script, vous pouvez utiliser "tput cols" pour obtenir la largeur. Ensuite, passez cette valeur à votre application Java comme une chaîne de caractères[] arg.

Comme ceci:

//#!/bin/bash

//#clear the screen

clear 

//#get the console width and height

c=$[$(tput cols)]

l=$[$(tput lines)]

//#pass the columns, lines and an optional third value as String[] args.

java -jar ~/bin/Plus.jar $c $l 

pourquoi est-ce une tâche difficile avec Java? Évidemment un bon endroit pour écrire une bonne API. Je suppose que nous pourrions essayer Apache.commun.exec?

2
répondu aubreybourke 2017-03-19 22:17:24

Python semble avoir une bonne solution:11.9.3. Interrogation de la taille du terminal de sortie. Je ne retiendrais pas mon souffle en attendant que ce soit disponible dans le Java de base, mais vous pourriez être en mesure d'utiliser Python pour rendre la fonctionnalité Python disponible.

0
répondu Michael Scheper 2013-10-22 01:26:00

pour moi, la seule façon de se faire une idée de la fenêtre du terminal (toujours pas correcte quand la fenêtre redimensionne) est d'utiliser une commande comme

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "mode con");
pb.redirectError(ProcessBuilder.Redirect.INHERIT);

quand courez sans le cmd.exe partie, il montre que la commande n'a pas pu être trouvé. Notez également l' redirectError partie. Si elle n'est pas utilisée, la taille de sortie Java sera utilisée, et non la taille réelle. Seulement avec cette combinaison, il est possible de saisir la taille réelle.

0
répondu Panayotis 2017-05-23 21:01:39