2016-12-22 15 views
2

私はSystem.inにユーザ入力を指示してJTextAreaのコンソールをシミュレートしようとしています。テスト文字列はJTextAreaに正常に追加され、メインメソッドのScanner.nextLine()は正常にユーザー入力を待ち、印刷します。ボタンを押しても、同じappendメソッドとscannerメソッドは機能しません。どんな勧告?ありがとう。スキャナが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

'新しいScanner(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() 

OR

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); 
    } 
} 
関連する問題