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.