java - 如何在 JFrame/JPanel 中可视化控制台 java

标签 java swing console jtextarea jtextcomponent

我使用 Swing 库制作了一个 Java 程序。 现在我想将我的控制台输出重定向到 JFrame 或 JPanel。

最佳答案

您需要创建一个 OutputStream 将输出重定向到文本区域并实现 OutputStream 接口(interface)的所有必要方法,然后在您的主程序中,将您的标准输出重定向到该流中。我在我的一个程序中使用了这样的东西:

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 + "> ");
         return;
      }

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

你可以用这个来证明它:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintStream;
import javax.swing.*;

@SuppressWarnings("serial")
public class TextAreaOutputStreamTest extends JPanel {

   private JTextArea textArea = new JTextArea(15, 30);
   private TextAreaOutputStream taOutputStream = new TextAreaOutputStream(
         textArea, "Test");

   public TextAreaOutputStreamTest() {
      setLayout(new BorderLayout());
      add(new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
      System.setOut(new PrintStream(taOutputStream));

      int timerDelay = 1000;
      new Timer(timerDelay , new ActionListener() {
         int count = 0;
         @Override
         public void actionPerformed(ActionEvent arg0) {

            // though this outputs via System.out.println, it actually displays
            // in the JTextArea:
            System.out.println("Count is now: " + count + " seconds");
            count++;
         }
      }).start();
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("Test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new TextAreaOutputStreamTest());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

关于java - 如何在 JFrame/JPanel 中可视化控制台 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776465/

相关文章:

c++ - 文件的新 C++ 错误

java - 已弃用 HttpGet、HttpClient、HttpResponse、HttpEntity、EntityUtils

java - 自午夜以来的时间

swing - 哪个 maven2 原型(prototype)用于 Swing 桌面应用程序?

ruby-on-rails - Rails 3 - 加快控制台加载时间

javascript - 有没有办法阻止 Javascript 命令在控制台中执行?

java - Play框架2.6 java websockets akka依赖注入(inject)

java - Spring Integration - 聚合和转换

java - NetBeans 7 中没有 GroupLayout,怎么了?

java - 两个 JFrames 同时运行