在外部jframe中显示java控制台

时间:2018-04-29 10:27:18

标签: java console jframe

我创建了一个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;
    }
}

但它不起作用。

我该怎么办?感谢。

3 个答案:

答案 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));

谢谢!