2010-12-12 96 views
2

你好 是否可以在JPanel中绘制java控制台返回的内容? 你有一个教程要遵循? 谢谢 swJava控制台JPanel

+1

您可能希望在您的问题标签中添加“Swing”以吸引论坛Swing专家。 :) – 2010-12-12 16:43:38

回答

2

首先从控制台读取。要做到这一点使用System.setOut()。使用ByteOutputStream,写在那里并从他们的阅读。你会得到你的程序打印到系统中。现在使用TextArea或JScrollPane来呈现文本。

6

我不记得在那里我发现这一点,但我已经输出的输出流在一个JPanel举行一个JTextArea使用I类叫TextAreaOutputStream:

import java.io.IOException; 
import java.io.OutputStream; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class TextAreaOutputStream extends OutputStream { 

    private final JTextArea textArea; 
    private final StringBuilder sb = new StringBuilder(); 
    private String title; 

    public TextAreaOutputStream(final JTextArea textArea, String title) { 
     this.textArea = textArea; 
     this.title = title; 
     sb.append(title + "> "); 
    } 

    @Override 
    public void flush() { 
    } 

    @Override 
    public void close() { 
    } 

    @Override 
    public void write(int b) throws IOException { 

     if (b == '\r') 
      return; 

     if (b == '\n') { 
      final String text = sb.toString() + "\n"; 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        textArea.append(text); 
       } 
      }); 
      sb.setLength(0); 
      sb.append(title).append("> "); 
     } 

     sb.append((char) b); 
    } 
} 

我然后再直接标准输出正如Alex在上面的回答中提到的那样,流向这个对象。

+1

'sb.append(title).append(“>”);'可能会更有效率。 – 2012-05-29 21:43:04

+0

@DavidConrad:的确如此,它会避免一个String concat。谢谢,并回答编辑。 – 2012-05-29 21:49:04

2

创建FilterOutputStream的子类以将所有内容都回显到JTextArea。

class Echo extends FilterOutputStream { 

    private final JTextArea text; 

    public Echo(OutputStream out, JTextArea text) { 
     super(out); 
     if (text == null) throw new IllegalArgumentException("null text"); 
     this.text = text; 
    } 

    @Override 
    public void write(int b) throws IOException { 
     super.write(b); 
     text.append(Character.toString((char) b)); 
     // scroll to end? 
    } 

    // overwrite the other write methods for better performance 
} 

和替换的标准输出:

JTextArea text = new JTextArea(); 
    System.setOut(new PrintStream(new Echo(System.out, text)));