Показать консоль Java во внешнем jframe - PullRequest
0 голосов
/ 29 апреля 2018

Я делаю Java-приложение, но теперь мне нужно отобразить все выходные данные консоли (например, исключения, println, ecc ...) во внешнем jframe. Я просмотрел некоторые решения, но не знаю, что мне нужно делать.

Пожалуйста, не отмечайте это как дубликат, потому что я не нахожу ничего, чтобы решить мой вопрос.

Я пробовал это:

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 голосов
/ 29 апреля 2018

Если вам нужно только отобразить строки на консоли, это будет работать. Возможно, вам нужно сначала преобразовать более сложные данные в строку.

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), которая добавляет отправленную строку в консоль. Так что в вашем приложении, например, вы можете просто вызвать этот метод с помощью console.printToConsole("I will be displayed in JFrame Console") На самом деле это работает только со строками, но вы можете добавлять более сложные структуры данных.

С наилучшими пожеланиями

0 голосов
/ 29 апреля 2018

Я основывался на ответе @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));

Спасибо! * * 1004

0 голосов
/ 29 апреля 2018

Я исправил ваш код и улучшил решение:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...