Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Reindirizzare System.in e System.out

    Ciao a tutti! sono un "novellino" della programmazione java. Ho fatto un piccolo gioco testuale, ora mi servirebbe sapere come posso fare per reindirizzare system.in e system.out in un campo jtextarea o qualcosa di simile affinche' compaia nell' interfaccia grafica! grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da teojuve93 Visualizza il messaggio
    Ciao a tutti! sono un "novellino" della programmazione java. Ho fatto un piccolo gioco testuale, ora mi servirebbe sapere come posso fare per reindirizzare system.in e system.out in un campo jtextarea o qualcosa di simile affinche' compaia nell' interfaccia grafica! grazie in anticipo
    Se ti interessa avere un componente che faccia da console "grafica", con un aspetto e soprattutto con un comportamento il più vicino possibile a quello di una console reale, sappi che farlo "da zero" è parecchio complesso. Quindi innanzitutto cerca in rete se esiste già (è possibile) una qualche libreria che offre un componente di questo tipo e che magari, si spera, riesca a fornire la coppia di oggetti PrintStream/InputStream, in modo da poterli assegnare direttamente a setOut/setIn di java.lang.System.

    Se invece ti accontenti di un JTextArea non editabile per l'output e un JTextField (o altro JTextArea) per l'input, allora è già un pochino più semplice ma facendolo da zero devi comunque affrontare un paio di aspetti non banali.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok grazie! Saresti in grado di farmi un esempio pratico pratico di come utilizzare JTextArea/JTextField? sempre sotto questo aspetto...ovvero far si che ciò che ci sia scritto da system.in venga indirizzato nel textField.
    Ultima modifica di teojuve93; 16-10-2014 a 23:28

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da teojuve93 Visualizza il messaggio
    Ok grazie! Saresti in grado di farmi un esempio pratico pratico di come utilizzare JTextArea/JTextField?
    Non è una cosa che si può fare in poche righe, come ho detto ci sono alcune cose da affrontare.

    Innanzitutto PrintStream è una classe complessa e con parecchi metodi, quindi generalmente non è questa che si estende per ridefinire i metodi. In genere è più preferibile creare un XyzOutputStream custom da assegnare al PrintStream. Ma il punto è che gli output stream sono orientati ai byte, il tuo XyzOutputStream quindi riceverebbe sequenze di byte che tu devi riconvertire in caratteri! (appunto perché l'output non è un file o altro binario ma un componente GUI di testo). Quindi entra in gioco la questione del charset. O usi un charset single-byte (accettando limitazioni sul set di caratteri) oppure usi un charset multi-byte (es. UTF-16) che complica un pelino la riconversione.

    Inoltre tu dovresti implementare un XyzInputStream per l'input. C'è sempre la questione del charset ma è più semplice, perché tu parti da testo nel componente GUI per ottenere una sequenza di byte. Il problema qui è un altro. L'input dallo standard-input è "sincrono" mentre l'input nella GUI è gestito ad eventi e oltretutto è nel Event Dispatch Thread. A livello basilare si potrebbe usare la coppia PipedInputStream/PipedOutputStream.

    P.S. consiglio: se vuoi questa strada, inizia dall'ultima parte, con la coppia di classi che ho detto.
    Ultima modifica di andbin; 16-10-2014 a 23:40
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ho voluto provare a scrivere un esempio di codice per la sola parte di input, che è (come ho detto prima) la più semplice. Ecco il codice:

    codice:
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class GraphicalConsole {
        private final PipedInputStream stdinPipedInput;
        private final PipedOutputStream stdinPipedOutput;
        private final PrintStream stdinStream;
        private ConFrame frame;
    
        public GraphicalConsole() throws IOException {
            stdinPipedInput = new PipedInputStream();
            stdinPipedOutput = new PipedOutputStream(stdinPipedInput);
            stdinStream = new PrintStream(stdinPipedOutput, true);   // autoFlush
    
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    frame = new ConFrame();
                    frame.setVisible(true);
                }
            });
        }
    
        public InputStream getIn() {
            return stdinPipedInput;
        }
    
        public void close() {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    frame.dispose();
                }
            });
        }
    
        private class ConFrame extends JFrame implements ActionListener {
            private JTextField inputTextField;
    
            public ConFrame() {
                super("Console");
    
                setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                setSize(400, 250);
                setLocationRelativeTo(null);
    
                inputTextField = new JTextField();
                inputTextField.addActionListener(this);
    
                getContentPane().add(inputTextField, BorderLayout.SOUTH);
            }
    
            public void actionPerformed(ActionEvent e) {
                String text = inputTextField.getText();
                inputTextField.setText("");
    
                stdinStream.println(text);
            }
        }
    }

    e poi un sorgente di test:

    codice:
    import java.io.*;
    import java.util.*;
    
    public class GraphicalConsoleTest {
        public static void main(String[] args) {
            GraphicalConsole graphicalConsole;
    
            try {
                graphicalConsole = new GraphicalConsole();
            } catch (IOException e) {
                System.err.println(e);
                return;
            }
    
            System.setIn(graphicalConsole.getIn());
    
            Scanner sc = new Scanner(System.in);
    
            String line;
    
            do {
                line = sc.nextLine();
                System.out.println("in: " + line);
            } while (!line.equals("exit"));
    
            graphicalConsole.close();
        }
    }

    Prendetelo in generale come esempio da cui partire, non è perfetto e si può sicuramente migliorare su diversi aspetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    grazie mille! spero di riuscire a reindirizzare nella stessa area input e output

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.