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
Bonjour,

J'aimerais exporter un programme crée en Java sous forme de console, c'est à dire qu'il n'y a pas de fenêtre etc.
Ou alors, créer une fenêtre sans rien de plus, qui afficherait la même chose qu'affiche la console d'Eclipse, pour pouvoir exporter le programme sous forme de .jar exécutable.
Merci !

PS : en d'autres termes, j'aimerais simplement rediriger ce qui se trouve dans la console Eclipse vers une fenêtre graphique pour pouvoir exporter le programme et l'utiliser sans Eclipse.

EchoIsON.

A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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

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
    }
}
2
Utilisateur anonyme
24 déc. 2015 à 11:44
Bonjour.
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 déc. 2015 à 12:47
Tel qu'il est tu peux utiliser System.in, mon exemple fonctionne.
C'est la case du bas pour saisir du texte...
0
Utilisateur anonyme
24 déc. 2015 à 12:54
Je m'en doute bien, mais je n'ai aucune case du bas avec cet exemple... Seulement une seule case où le texte est affiché, non editable.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 déc. 2015 à 15:49
Pourtant la deuxième case est bien dans mon code :
frame.add(inArea, BorderLayout.SOUTH);

Peut être une spécificité de Mac ?

Essaye de rajouter ceci :
frame.setLayout(new BorderLayout());

Normalement c'est censé être la valeur par défaut mais peut être pas sur Mac...
0
Utilisateur anonyme
24 déc. 2015 à 18:29
En rajoutant cette ligne juste avant
frame.add(inArea, BorderLayout.SOUTH);

Même le texte ne s'affiche plus, fenêtre vide, si on l'ajoute en premier après
JFrame frame = new JFrame();

Alors le résultat est le même qu'au début...
0
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
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 :
java -jar MonProgramme.jar 

Non?
0
Utilisateur anonyme
22 déc. 2015 à 16:04
Certes oui, mais j'aimerais en faire un .jar executable directement avec un double clique dans une interface de fenetre Java
0
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
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
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.
0
Utilisateur anonyme
22 déc. 2015 à 16:35
Merci pour ces infos,
Comment je dois faire pour "transferer" ma console vers cette fenêtre ?
En fait je veux que tout ce qui s'affiche dans ma console s'affiche dans une fenêtre
0
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
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 :)
0
Utilisateur anonyme
22 déc. 2015 à 16:49
Merci, mais je ne sais pas comment faire cela... Je debute en Java...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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

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);
    }
}
0
Utilisateur anonyme
22 déc. 2015 à 22:08
Bonsoir KX,

Merci, ce code marche pour afficher la console dans une fenêtre, mais je ne peux pas interagir avec, comme je le faisais avec la console...
Par exemple, impossible d'utiliser nextLine() etc.

EchoIsON
0
Utilisateur anonyme > Utilisateur anonyme
22 déc. 2015 à 22:23
En fait, ça devient un espece de document texte que je peux effacer, editer etc.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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
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...
0
Utilisateur anonyme
22 déc. 2015 à 22:51
J'ai compris, merci... Je vais essayer de faire cela.
Comment on rajoute un champ de texte distinct editable ? En fait c'est plus compliqué que je ne le pensais...
Merci beaucoup pour le code sinon !!
0