2
System.in
으로 사용자 입력을 지정하여 JTextArea
으로 콘솔을 시뮬레이션하려고합니다. 테스트 문자열은 JTextArea
에 성공적으로 추가되고 주 방법의 Scanner.nextLine()
은 사용자 입력을 기다리고 성공적으로 인쇄합니다. 버튼을 누를 때 동일한 추가 및 스캐너 메소드가 작동하지 않습니다. 어떤 추천? 감사.스캐너가 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;
}
}
저는 스캐너가 GUI가 아닌 명령 줄 도구라고 생각합니다. _button_을 누를 때 스캐너가 다음 줄을 캡처하게 만드는 원인은 무엇이라고 생각합니까? –
'새 스캐너 (System.in);'는 명령 행에서 입력을받습니다. GUI 응용 프로그램은 이러한 명령 행을 보장하지 않습니다. –
Enter 키를 누르면 입력이 PipedInputStream에서 System.in으로 이동하고 스캐너는 System.in에서 해당 정보를 가져옵니다. 따라서 스캐너는 사용 된 스트림이 무엇이든간에 작동해야합니다. 권리? –