Exporter un programme "console"
Résolu/Fermé
Utilisateur anonyme
-
Modifié par EchoIsON le 22/12/2015 à 14:51
Utilisateur anonyme - 24 déc. 2015 à 18:32
Utilisateur anonyme - 24 déc. 2015 à 18:32
A voir également:
- Exporter un programme "console"
- Programme demarrage windows 10 - Guide
- Chrome exporter favoris - Guide
- Exporter favoris firefox - Guide
- Exporter conversation sms android - Guide
- Exporter photos google photos - Guide
3 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
23 déc. 2015 à 12:36
23 déc. 2015 à 12:36
Voici un complément au programme d'hier pour gérer les 3 flux.
Tu remarqueras qu'il y a plus de choses à gérer pour System.in qu'il n'y en avait à gérer pour System.out
Mais sinon, même principe, pour ton programme tu as juste à appeler la méthode d'initialisation, après la fenêtre se substitue aux flux standards System.in/out/err
Tu remarqueras qu'il y a plus de choses à gérer pour System.in qu'il n'y en avait à gérer pour System.out
Mais sinon, même principe, pour ton programme tu as juste à appeler la méthode d'initialisation, après la fenêtre se substitue aux flux standards System.in/out/err
import java.awt.BorderLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; import java.util.Scanner; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextPane; import javax.swing.text.JTextComponent; class JTextComponentOutputStream extends OutputStream { private final JTextComponent component; private final StringBuilder buffer; public JTextComponentOutputStream(JTextComponent component) { this.component = component; this.buffer = new StringBuilder(); } @Override public void write(int b) throws IOException { buffer.append((char) b); component.setText(buffer.toString()); component.setCaretPosition(buffer.length()); } } class InputStreamKeyListener extends PipedInputStream implements KeyListener { private final JTextComponent component; private final PipedOutputStream out; public InputStreamKeyListener(JTextComponent component) { super(); try { this.component = component; this.out = new PipedOutputStream(this); } catch (IOException e) { throw new RuntimeException(e); } component.addKeyListener(this); } @Override public void keyTyped(KeyEvent evt) { if (evt.getKeyChar() == KeyEvent.VK_ENTER) { try { String text = component.getText(); out.write(text.getBytes()); component.setText(""); System.out.print(text); out.flush(); } catch (IOException e) { throw new RuntimeException(e); } } } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } } public class Test { public static void initConsole() { // out,err JTextComponent outArea = new JTextArea(); outArea.setEditable(false); OutputStream output = new JTextComponentOutputStream(outArea); PrintStream stream = new PrintStream(output); System.setOut(stream); System.setErr(stream); // in JTextPane inArea = new JTextPane(); InputStream input = new InputStreamKeyListener(inArea); System.setIn(input); // frame JFrame frame = new JFrame(); frame.add(new JScrollPane(outArea), BorderLayout.CENTER); frame.add(inArea, BorderLayout.SOUTH); frame.setSize(400, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { initConsole(); Scanner sc = new Scanner(System.in); System.out.println("Entrez un nombre :"); // System.out int n = sc.nextInt(); // System.in System.out.println("Le nombre choisi est : "+n); throw new RuntimeException("test"); // System.err } }
faseldi
Messages postés
279
Date d'inscription
dimanche 9 novembre 2014
Statut
Membre
Dernière intervention
3 janvier 2017
20
Modifié par faseldi le 22/12/2015 à 16:03
Modifié par faseldi le 22/12/2015 à 16:03
Je m'y connais pas en mac, mais avec eclipse vous pouvez l'exporter en .jar et le lancer avec la console avec la commande :
Non?
java -jar MonProgramme.jar
Non?
faseldi
Messages postés
279
Date d'inscription
dimanche 9 novembre 2014
Statut
Membre
Dernière intervention
3 janvier 2017
20
22 déc. 2015 à 16:22
22 déc. 2015 à 16:22
Ah, alors il faudrait voir pour faire une interface graphique.
En Java le plus simple c'est Swing.
Vas voir dans le package swing pour avoir une fenêtre.
Par exemple pour créer une fenetre vide tu peux faire
Au début quand on fait du swing on oublie de setVisible(true);
Si tu le met pas ta fenetre s'affiche pas ! :p
Tu peux rajouter :
Qui coupe le programme lorsque tu fermes la fenêtre.
En Java le plus simple c'est Swing.
Vas voir dans le package swing pour avoir une fenêtre.
Par exemple pour créer une fenetre vide tu peux faire
javax.swing.JFrame f = new javax.swing.JFrame("Une fenetre");
f.setSize(1920,1080);
f.setVisible(true);
Au début quand on fait du swing on oublie de setVisible(true);
Si tu le met pas ta fenetre s'affiche pas ! :p
Tu peux rajouter :
f.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
Qui coupe le programme lorsque tu fermes la fenêtre.
faseldi
Messages postés
279
Date d'inscription
dimanche 9 novembre 2014
Statut
Membre
Dernière intervention
3 janvier 2017
20
22 déc. 2015 à 16:45
22 déc. 2015 à 16:45
Je vois qu'une seule solution (ça veut pas dire qu'il y en a qu'une), utiliser une JTextArea, dans laquelle les messages de la console s'affichent (voir runtime pour l’exécution des commandes console), ou afficher les messages directement dans la JTextArea, un JLabel, ou autre, plus simple et plus transportable entre OS :)
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
22 déc. 2015 à 20:26
22 déc. 2015 à 20:26
Bonjour,
Voici un exemple vite fait.
Au niveau de ton code, il faut juste rajouter l'initialisation, l'affichage est ensuite géré par les commandes habituelles de System.out
Voici un exemple vite fait.
Au niveau de ton code, il faut juste rajouter l'initialisation, l'affichage est ensuite géré par les commandes habituelles de System.out
import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.text.JTextComponent; class JTextComponentOutputStream extends OutputStream { private final JTextComponent component; private final StringBuilder buffer; public JTextComponentOutputStream(JTextComponent component) { this.component = component; this.buffer = new StringBuilder(); } @Override public void write(int b) throws IOException { buffer.append((char) b); component.setText(buffer.toString()); component.setCaretPosition(buffer.length()); } } public class Test { public static void initConsole() { JTextArea sysout = new JTextArea(); System.setOut(new PrintStream(new JTextComponentOutputStream(sysout))); JFrame frame = new JFrame(); frame.add(new JScrollPane(sysout)); frame.setSize(600, 800); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { initConsole(); for (int i = 0; i < 100; i++) System.out.println(i); } }
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
22 déc. 2015 à 22:42
22 déc. 2015 à 22:42
Il aurait fallu être plus précis, parce que ce que tu demandais c'était ça :
"je veux que tout ce qui s'affiche dans ma console s'affiche dans une fenêtre"
Et mon programme fait bien ce travail...
Quand au fait que ça s'efface ou s'édite, il suffit de faire un
En Java tu as 3 flux pour la console : System.out, System.err et System.in
Mon code travailles sur System.out et on peut facilement rajouter System.err
Mais si tu veux faire des nextLine, c'est à dire travailler avec System.in, il va falloir rajouter pas mal de code. Le plus simple étant sûrement de rajouter un champ texte distinct, qui lui serait éditable et dans lequel chaque ajout serait envoyé au flux...
"je veux que tout ce qui s'affiche dans ma console s'affiche dans une fenêtre"
Et mon programme fait bien ce travail...
Quand au fait que ça s'efface ou s'édite, il suffit de faire un
sysout.setEditable(false);pour désactiver cette fonctionnalité.
En Java tu as 3 flux pour la console : System.out, System.err et System.in
Mon code travailles sur System.out et on peut facilement rajouter System.err
Mais si tu veux faire des nextLine, c'est à dire travailler avec System.in, il va falloir rajouter pas mal de code. Le plus simple étant sûrement de rajouter un champ texte distinct, qui lui serait éditable et dans lequel chaque ajout serait envoyé au flux...
24 déc. 2015 à 11:44
D'abord, merci pour ce code et pour l'effort fourni !
Je viens de le tester avec mon code, et comme j'avais le même résultat qu'hier (c'est à dire qu'on ne peut pas interagir en écrivant etc, on dirait que seule la partie system.out est prise en compte...), j'ai essayé d'executer le code tel qu'il est ici (au cas où le problème serait dans ma partie du code), mais j'ai le même résultat...
EchoIsON
24 déc. 2015 à 12:47
C'est la case du bas pour saisir du texte...
24 déc. 2015 à 12:54
24 déc. 2015 à 15:49
Peut être une spécificité de Mac ?
Essaye de rajouter ceci :
Normalement c'est censé être la valeur par défaut mais peut être pas sur Mac...
24 déc. 2015 à 18:29
Même le texte ne s'affiche plus, fenêtre vide, si on l'ajoute en premier après
Alors le résultat est le même qu'au début...