我创建了一个java应用程序,但现在我需要在外部jframe中显示控制台的所有输出(例如,exception,println,ecc ...)。 我查看了一些解决方案,但我不知道自己需要做什么。
请不要将此标记为重复,因为我找不到任何解决问题的方法。
我试过了:
public class Main extends JFrame {
public static void main(String[] args) {
Console console = new Console();
console.init();
Main launcher = new Main();
launcher.setVisible(true);
console.getFrame().setLocation(
launcher.getX() + launcher.getWidth() + launcher.getInsets().right,
launcher.getY());
}
private Main() {
super();
setSize(600, 600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
class Console {
final JFrame frame = new JFrame();
public Console() {
JTextArea textArea = new JTextArea(24, 80);
textArea.setBackground(Color.BLACK);
textArea.setForeground(Color.LIGHT_GRAY);
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
textArea.append(String.valueOf((char) b));
}
}));
frame.add(textArea);
}
public void init() {
frame.pack();
frame.setVisible(true);
System.out.println("Hello world!");
}
public JFrame getFrame() {
return frame;
}
}
但它不起作用。
我该怎么办?感谢。
答案 0 :(得分:3)
如果您只需要在控制台上显示字符串,这将有效。也许您需要先将更复杂的数据转换为String。
package sof2;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class Main2 extends JFrame {
public static void main(String[] args) {
Console console = new Console();
console.init();
Main2 launcher = new Main2();
launcher.setVisible(true);
console.getFrame().setLocation(
launcher.getX() + launcher.getWidth() + launcher.getInsets().right,
launcher.getY());
console.printOnConsole("BLABLABLA");
}
private Main2() {
super();
setSize(600, 600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
class Console {
final JFrame frame = new JFrame();
JTextArea textArea = new JTextArea(24, 80);
public Console() {
textArea.setBackground(Color.BLACK);
textArea.setForeground(Color.LIGHT_GRAY);
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
textArea.append(String.valueOf((char) b));
}
}));
frame.add(textArea);
}
public void init() {
frame.pack();
frame.setVisible(true);
}
public JFrame getFrame() {
return frame;
}
public void printOnConsole(String s){
this.textArea.append(s);
}
}
我添加了一个名为printOnConsole(String s)
的函数,它将提交的String附加到控制台。
因此,在您的应用程序中,您可以使用console.printToConsole("I will be displayed in JFrame Console")
调用此方法
这实际上只适用于字符串,但可以随意添加更复杂的数据结构。
最好的问候
答案 1 :(得分:1)
我修复了您的代码并改进了解决方案:
public class Main extends JFrame {
private Main() {
super();
setSize(600, 600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) throws Exception {
Console console = new Console();
Main launcher = new Main();
launcher.setVisible(true);
console.getFrame().setLocation(
launcher.getX() + launcher.getWidth() + launcher.getInsets().right,
launcher.getY());
System.out.println("1- log");
System.out.println("2- log");
System.out.println("3- log");
System.err.println("1- error");
System.err.println("2- error");
}
}
class Console {
final JFrame frame = new JFrame();
JTextArea textArea;
public Console() throws Exception {
textArea = new JTextArea(24, 80);
textArea.setBackground(Color.BLACK);
textArea.setForeground(Color.LIGHT_GRAY);
textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
frame.add(textArea);
frame.pack();
frame.setVisible(true);
redirectOut();
System.out.println("Hello world!");
System.out.println("test");
// throw new Exception("excccccc");
}
public PrintStream redirectOut() {
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
textArea.append(String.valueOf((char) b));
}
};
PrintStream ps = new PrintStream(out);
System.setOut(ps);
System.setErr(ps);
return ps;
}
public JFrame getFrame() {
return frame;
}
}
答案 2 :(得分:1)
我基于@Razavi的答案,我修改了它来打印错误:
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
textArea.append(String.valueOf((char) b));
}
};
System.setOut(new PrintStream(out));
System.setErr(new PrintStream(out));
谢谢!