【问题标题】:Java Console JPanelJava 控制台 JPanel
【发布时间】:2010-12-12 16:29:37
【问题描述】:

你好 是否可以在 JPanel 中绘制 java 控制台返回的内容? 你有教程吗? 谢谢 切换

【问题讨论】:

  • 您可能希望在您的问题标签中添加“Swing”以吸引论坛 Swing 专家。 :)

标签: java swing console jpanel


【解决方案1】:

我不记得我在哪里找到的,但我已经使用一个名为 TextAreaOutputStream 的类将输出流输出到 JPanel 中保存的 JTextArea:

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 在上面的回答中提到的那样,我将标准输出 Stream 重定向到该对象。

【讨论】:

  • sb.append(title).append("> "); 可能会更有效率。
  • @DavidConrad:确实可以避免字符串连接。谢谢,答案已编辑。
【解决方案2】:

首先从控制台读取。为此,请使用 System.setOut()。使用 ByteOutputStream,在那里写入并从中读取。您将得到您的程序打印到系统的内容。现在使用 TextArea 或 JScrollPane 来呈现文本。

【讨论】:

    【解决方案3】:

    创建 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)));
    

    【讨论】:

      【解决方案4】:

      Message Console 提供了更多您可能感兴趣的选项。

      【讨论】:

        猜你喜欢
        • 2010-11-01
        • 2012-04-04
        • 2015-02-17
        • 2010-11-03
        • 1970-01-01
        • 2014-09-28
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多