2016-12-22 14 views
2

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; 
    } 
} 
+1

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? –

+0

'neuer Scanner (System.in);' nimmt Eingaben von der Befehlszeile. Eine GUI-Anwendung verfügt nicht über eine solche Befehlszeile. –

+0

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? –

Antwort

0

Ich denke, Sie haben Dinge kompliziert. Da du eine Konsole haben wolltest, stelle ich dir hier eine einfachere Lösung vor. Ich empfehle nicht, sc.nextLine() in einem Kontext wie Ihrem wegen bug zu verwenden. Das könnte Ursache Ihres Problems sein, sehen Sie es sich an. Sie können Eingaben auf verschiedene Arten erhalten. Zum Beispiel:

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

ODER

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

lange Kurzgeschichte, hier ist was ich schrieb. Es könnte Ihrem Zweck dienen:

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); 
    } 
} 
Verwandte Themen