如何在jframe/jpanel中可视化控制台java

fxnxkyjh  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(490)

我用swing库编写了一个java程序。现在我想将控制台输出重定向到jframe或jpanel中。

pes8fvy9

pes8fvy91#

一旦你有了 JFrame 或者 JPanel ,向其添加文本字段。 JTextArea 是个不错的选择,因为它是多行的。添加后,您可以 .append('text'); 而不是写 System.out.print(); ```
JFrame jFrame = new JFrame();

JTextArea jTextArea = new JTextArea();
jTextArea.append( "Hello World." );

jFrame.add( jTextArea );

2izufjch

2izufjch2#

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

  1. import java.io.IOException;
  2. import java.io.OutputStream;
  3. import javax.swing.JTextArea;
  4. import javax.swing.SwingUtilities;
  5. public class TextAreaOutputStream extends OutputStream {
  6. private final JTextArea textArea;
  7. private final StringBuilder sb = new StringBuilder();
  8. private String title;
  9. public TextAreaOutputStream(final JTextArea textArea, String title) {
  10. this.textArea = textArea;
  11. this.title = title;
  12. sb.append(title + "> ");
  13. }
  14. @Override
  15. public void flush() {
  16. }
  17. @Override
  18. public void close() {
  19. }
  20. @Override
  21. public void write(int b) throws IOException {
  22. if (b == '\r')
  23. return;
  24. if (b == '\n') {
  25. final String text = sb.toString() + "\n";
  26. SwingUtilities.invokeLater(new Runnable() {
  27. public void run() {
  28. textArea.append(text);
  29. }
  30. });
  31. sb.setLength(0);
  32. sb.append(title + "> ");
  33. return;
  34. }
  35. sb.append((char) b);
  36. }
  37. }

你可以用这个来演示:

  1. import java.awt.BorderLayout;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.io.PrintStream;
  5. import javax.swing.*;
  6. @SuppressWarnings("serial")
  7. public class TextAreaOutputStreamTest extends JPanel {
  8. private JTextArea textArea = new JTextArea(15, 30);
  9. private TextAreaOutputStream taOutputStream = new TextAreaOutputStream(
  10. textArea, "Test");
  11. public TextAreaOutputStreamTest() {
  12. setLayout(new BorderLayout());
  13. add(new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
  14. JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
  15. System.setOut(new PrintStream(taOutputStream));
  16. int timerDelay = 1000;
  17. new Timer(timerDelay , new ActionListener() {
  18. int count = 0;
  19. @Override
  20. public void actionPerformed(ActionEvent arg0) {
  21. // though this outputs via System.out.println, it actually displays
  22. // in the JTextArea:
  23. System.out.println("Count is now: " + count + " seconds");
  24. count++;
  25. }
  26. }).start();
  27. }
  28. private static void createAndShowGui() {
  29. JFrame frame = new JFrame("Test");
  30. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  31. frame.getContentPane().add(new TextAreaOutputStreamTest());
  32. frame.pack();
  33. frame.setLocationRelativeTo(null);
  34. frame.setVisible(true);
  35. }
  36. public static void main(String[] args) {
  37. SwingUtilities.invokeLater(new Runnable() {
  38. public void run() {
  39. createAndShowGui();
  40. }
  41. });
  42. }
  43. }
展开查看全部

相关问题