我用swing库编写了一个java程序。现在我想将控制台输出重定向到jframe或jpanel中。
pes8fvy91#
一旦你有了 JFrame 或者 JPanel ,向其添加文本字段。 JTextArea 是个不错的选择,因为它是多行的。添加后,您可以 .append('text'); 而不是写 System.out.print(); ```JFrame jFrame = new JFrame();
JFrame
JPanel
JTextArea
.append('text');
System.out.print();
JTextArea jTextArea = new JTextArea();jTextArea.append( "Hello World." );
jFrame.add( jTextArea );
2izufjch2#
您需要创建一个outputstream,将输出重新定向到文本区域,并实现outputstream接口的所有必要方法,然后在主程序中,将标准输出重定向到此流中。我在我的一个程序中使用过这样的东西:
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.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() {
public void close() {
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((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(); } }); }}
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;
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) {
createAndShowGui();
2条答案
按热度按时间pes8fvy91#
一旦你有了
JFrame
或者JPanel
,向其添加文本字段。JTextArea
是个不错的选择,因为它是多行的。添加后,您可以.append('text');
而不是写System.out.print();
```JFrame jFrame = new JFrame();
JTextArea jTextArea = new JTextArea();
jTextArea.append( "Hello World." );
jFrame.add( jTextArea );
2izufjch2#
您需要创建一个outputstream,将输出重新定向到文本区域,并实现outputstream接口的所有必要方法,然后在主程序中,将标准输出重定向到此流中。我在我的一个程序中使用过这样的东西:
你可以用这个来演示: