2012-03-13 27 views
-2

我想要一个完全可以工作的JTextArea而不是控制台但我不知道该怎么做!在JTextArea而不是控制台上显示数据

谢谢

+0

我仍然不能相信-6这种显着的问题! :D – SAbbasizadeh 2013-08-23 07:07:42

+2

很可能是因为你的问题没有显示出任何努力来解决你自己的问题。 – 2013-08-23 07:31:23

回答

18

该问题的解决方案是System.{in,out,err}重定向到一个JTextArea


  • System.out开始它非常直截了当地将其重定向到使用System.setOut方法您JTextArea组件。在下面的示例中,我使用管道和SwingWorker完成了这个工作,但这些都是让输出变得更简单的摆动组件。

  • 模拟System.in是类似的,您需要使用System.setIn将击键重定向到System.in。再次,在下面的例子中,我使用管道来获得更好的界面。我也缓冲线(就像一个“正常”的控制台会这样做),直到你输入。 (注意,例如箭头键将无法正常工作,但它不应该是很多工作得到它也被处理/忽略)。


的截图下面的文字制作

screenshot

public static JTextArea console(final InputStream out, final PrintWriter in) { 
    final JTextArea area = new JTextArea(); 

    // handle "System.out" 
    new SwingWorker<Void, String>() { 
     @Override protected Void doInBackground() throws Exception { 
      Scanner s = new Scanner(out); 
      while (s.hasNextLine()) publish(s.nextLine() + "\n"); 
      return null; 
     } 
     @Override protected void process(List<String> chunks) { 
      for (String line : chunks) area.append(line); 
     } 
    }.execute(); 

    // handle "System.in" 
    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; 
} 
:由一个号码的呼叫的“正常” System.out.print..方法的,然后用 Scanner等待输入上

和示例main方法:

public static void main(String[] args) throws IOException { 

    // 1. create the pipes 
    PipedInputStream inPipe = new PipedInputStream(); 
    PipedInputStream outPipe = new PipedInputStream(); 

    // 2. set the System.in and System.out streams 
    System.setIn(inPipe); 
    System.setOut(new PrintStream(new PipedOutputStream(outPipe), true)); 

    PrintWriter inWriter = new PrintWriter(new PipedOutputStream(inPipe), true); 

    // 3. create the gui 
    JFrame frame = new JFrame("\"Console\""); 
    frame.add(console(outPipe, inWriter)); 
    frame.setSize(400, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    // 4. write some output (to JTextArea) 
    System.out.println("Hello World!"); 
    System.out.println("Test"); 
    System.out.println("Test"); 
    System.out.println("Test"); 

    // 5. get some input (from JTextArea) 
    Scanner s = new Scanner(System.in); 
    System.out.printf("got from input: \"%s\"%n", s.nextLine()); 
} 
1
+0

我是新来的java,我做的只是简单地复制教程代码,并将其粘贴到我的java类,并希望它运行。那么给出的代码不是这样工作的。 :) – 2014-05-21 07:03:29

相关问题