Ich versuche, eine Konsole mit einer zu simulieren, indem Benutzereingaben auf System.in
gerichtet. Die Testzeichenfolge wird erfolgreich an JTextArea
angehängt, und die Scanner.nextLine()
der Hauptmethode wartet erfolgreich auf Benutzereingaben und druckt sie aus. Die gleichen Append- und Scanner-Methoden funktionieren nicht, wenn die Taste gedrückt wird. Irgendwelche Empfehlungen? Vielen Dank.Scanner funktioniert nicht in ActionListener
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
public class ScannerTest {
public static void main(String[] args) throws IOException {
PipedInputStream inPipe = new PipedInputStream();
System.setIn(inPipe);
PrintWriter inWriter = new PrintWriter(new PipedOutputStream(inPipe), true);
JTextArea console = console(inWriter);
Scanner sc = new Scanner(System.in);
JButton button = new JButton("Button");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
console.append("button pressed\n");
console.append("got from input: " + sc.nextLine() + "\n"); // cause of problem???
}
});
JFrame frame = new JFrame("Console");
frame.getContentPane().add(console);
frame.getContentPane().add(button, "South");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
console.append("test\n");
console.append("got from input: " + sc.nextLine() + "\n");
}
public static JTextArea console(final PrintWriter in) {
final JTextArea area = new JTextArea();
area.addKeyListener(new KeyAdapter() {
private StringBuffer line = new StringBuffer();
@Override public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (c == KeyEvent.VK_ENTER) {
in.println(line);
line.setLength(0);
} else if (c == KeyEvent.VK_BACK_SPACE) {
line.setLength(line.length() - 1);
} else if (!Character.isISOControl(c)) {
line.append(e.getKeyChar());
}
}
});
return area;
}
}
Ich denke, dass der Scanner ein Befehlszeilenprogramm ist, kein GUI ein. Was denkst du würde der Auslöser sein, dass der Scanner die nächste Zeile aufnimmt, wenn ein _Button_ gedrückt wird? –
'neuer Scanner (System.in);' nimmt Eingaben von der Befehlszeile. Eine GUI-Anwendung verfügt nicht über eine solche Befehlszeile. –
Die Eingabe geht von PipedInputStream zu System.in, wenn die Eingabetaste gedrückt wird und der Scanner seine Informationen von System.in erhält. Der Scanner sollte also mit dem verwendeten Stream arbeiten. Recht? –