2016-12-22 1 views
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; 
    } 
} 
+1

저는 스캐너가 GUI가 아닌 명령 줄 도구라고 생각합니다. _button_을 누를 때 스캐너가 다음 줄을 캡처하게 만드는 원인은 무엇이라고 생각합니까? –

+0

'새 스캐너 (System.in);'는 명령 행에서 입력을받습니다. GUI 응용 프로그램은 이러한 명령 행을 보장하지 않습니다. –

+0

Enter 키를 누르면 입력이 PipedInputStream에서 System.in으로 이동하고 스캐너는 System.in에서 해당 정보를 가져옵니다. 따라서 스캐너는 사용 된 스트림이 무엇이든간에 작동해야합니다. 권리? –

답변

0

나는 지나치게 복잡하다고 생각합니다. 콘솔을 원했기 때문에 여기서 간단한 솔루션을 제시합니다. 그들이 bug로 인해 귀하의 컨텍스트에서 sc.nextLine()을 사용하지 않는 것이 좋습니다. 그게 당신 문제의 원인일지도 모르니, 한번보세요. 다양한 방법으로 의견을 얻을 수 있습니다. 예를 들어 :

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
String str = reader.readLine() 

또는

String str = System.console().readLine(); 

길고도 짧은 이야기, 여기에 내가 쓴거야. 귀하의 목적에 부합 할 수 있습니다 :

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.ScrollPaneConstants; 

public class MyConsole { 
    public static void main(String[] args) { 

     JTextField field = new JTextField(); 
     JTextArea area = new JTextArea(); 

     area.setLineWrap(true); 

     field.addKeyListener(new KeyListener() { 
      @Override 
      public void keyTyped(KeyEvent e) { 

      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
       if(e.getKeyCode() == KeyEvent.VK_ENTER) 
       { 
        area.setText(area.getText() + "\n" + field.getText()); //Do whatever you like with the stirng 
        field.setText(""); 
       } 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
      } 

     }); 


     JScrollPane scPane = new JScrollPane(area); 
     scPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 

     JButton button = new JButton("Button"); 
     button.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 

       area.setText(area.getText() + "\n" + field.getText()); //You can also use button as well 
       field.setText(""); 
      } 
     }); 

     JFrame frame = new JFrame("Console"); 

     frame.getContentPane().add(field, BorderLayout.NORTH); 
     frame.getContentPane().add(button, BorderLayout.SOUTH); 
     frame.getContentPane().add(scPane, BorderLayout.CENTER); 
     frame.getContentPane().setPreferredSize(new Dimension(400, 400)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
관련 문제