[FX] Вывод консоли в TextArea

 
 
 
Сообщения:13
Здравствуйте, имею TextArea с выключенным доступом к редактированию (пользователь не может в ней писать). Поле должно иметь предназначение консоли, в которую будут выводиться логи. Как это можно сделать?
11 жабка.
 
 
Сообщения:1046
System.setOut(out);


так можно поставить свой поток вывода вместо консоли. дальше элементарно.
 
 
Сообщения:13
windruf:
System.setOut(out);


так можно поставить свой поток вывода вместо консоли. дальше элементарно.

А как получить поток вывода у TextArea?
 
 
Сообщения:127
Что именно нужно сделать? Просто установить текст?

    TextArea textArea = new TextArea();
    textArea.setText("Text");


Для добавления текста
    textArea.appendText("\nAppend Text");


Если это, то что нужно. То может стоит научиться пользоваться поисковиком?
Изменен:30 мая 2020 10:17
 
 
Сообщения:13
Dilettante:
Что именно нужно сделать? Просто установить текст?

    TextArea textArea = new TextArea();
    textArea.setText("Text");


Для добавления текста
    textArea.appendText("\nAppend Text");


Если это, то что нужно. То может стоит научиться пользоваться поисковиком?


Мне нужно сделать из TextArea консоль, а не просто добавлять туда текст. В консоль выводится много важных данных и нужно отобразить их на экране
 
 
Сообщения:127
windruf, дал ответ. Перенаправить вывод. Например создать свой класс расширенный OutputStream, в нем переопределить метод записи на вашу консоль. И далее перенаправить вывод System.setOut(new PrintStream(ваша консоль))....

Дополнение:

Java:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        TextArea myConsole = new TextArea();
        System.setOut(new PrintStream(new TextAreaStream(myConsole)));
        System.out.println("My Console JavaFX");

        stage.setScene(new Scene(myConsole));
        stage.show();
        stage.centerOnScreen();
    }
}

class TextAreaStream extends OutputStream {
    TextArea textArea;
    public TextAreaStream(TextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) throws IOException {
        textArea.appendText(String.valueOf((char) b));
    }
}


Kotlin:
import javafx.application.Application
import javafx.application.Application.launch
import javafx.scene.Scene
import javafx.scene.control.TextArea
import javafx.stage.Stage
import java.io.OutputStream
import java.io.PrintStream

class App: Application() {
    override fun start(stage: Stage) {
        val myConsole = TextArea()
        System.setOut(PrintStream(MyOutputStream(myConsole)))
        println("My KotlinFX console")

        stage.scene = Scene(myConsole)
        stage.show()
        stage.centerOnScreen()
    }
}

class MyOutputStream(private val textArea: TextArea): OutputStream() {
    override fun write(b: Int) {
        textArea.appendText((b.toChar()).toString())
    }
}

fun main(args: Array<String>) {
    launch(App::class.java, *args)
}


Дополнение:
Кстати, далеко ходить не нужно - Google выдает второй ссылкой - https://github.com/uphy/javafx-console


P.S. - Я, например, ни с первого раза ни со второго не понял формулировку. Перенаправить вывод консоли в TextArea - сразу все понятно...
Изменен:30 мая 2020 14:54
 
 
Сообщения:13
Большое спасибо. я долго гуглил, но не мог правильно сформулировать, а потому и не находил
Я ещё совсем новичок в FX)
 
 
Сообщения:13
Вышла ошибка:
Exception in Application start method
java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException
	at sample.assets.TextAreaStream.write(TextAreaStream.java:16)
	at java.base/java.io.OutputStream.write(OutputStream.java:157)
	at java.base/java.io.PrintStream.write(PrintStream.java:559)
	at java.base/sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:233)
	at java.base/sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:312)
	at java.base/sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
	at java.base/java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:184)
	at java.base/java.io.PrintStream.write(PrintStream.java:606)
	at java.base/java.io.PrintStream.print(PrintStream.java:745)
	at java.base/java.io.PrintStream.println(PrintStream.java:882)
	at sample.Main.start(Main.java:21)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:919)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
	... 1 more
Exception running application sample.Main


Код:
@Override
    public void start(Stage primaryStage) throws Exception {
        System.setOut(new PrintStream(new TextAreaStream(Controller.console_reader)));
        System.out.println("1"); // РУГАЕТСЯ НА ЭТУ СТРОКУ

// следующий класс

package sample.assets;

import javafx.scene.control.TextArea;

import java.io.IOException;
import java.io.OutputStream;

public class TextAreaStream extends OutputStream {
    TextArea textArea;
    public TextAreaStream(TextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) throws IOException {
        textArea.appendText(String.valueOf((char) b)); // РУГАЕТСЯ НА ЭТУ СТРОКУ
    }
}

Изменен:30 мая 2020 16:19
 
 
Сообщения:127
NullPointerException

Я не могу сказать по обрывкам большего...

Свой код я проверял, все работает.

Controller.console_reader - это что?
Изменен:30 мая 2020 16:35
 
 
Сообщения:13
В классе контроллера есть
@FXML
    public static TextArea console_reader;

Я пользуюсь SceneBuilder и поэтому получить компонент могу только так
 
 
Сообщения:127
Во-первых, зачем ссылка через статик передается? Второе, вы не можете так делать не из другого места и не можете из конструктора контроллера, потому что он даже еще не загружен.

Поэтому и NullPointerException!

Учите JavaFX товарищ...


У контроллера есть специальный метод(initialize) из которого можно обращаться к полям FXML.
Изменен:30 мая 2020 18:10
 
 
Сообщения:13
Если есть какой нибудь хороший (и не устаревший) гайд по FX, буду очень благодарен)
Потому что я уже многое читал и смотрел, но реально хорошего материала не нашёл. А очень хочу научиться
 
 
Сообщения:127
Прохоренок Н. - JavaFX - 2020
Google тоже всё знает....

P.S. Metanit убрал, там недостаточно инфы, текущая проблема так же не рассмотрена.
Изменен:30 мая 2020 17:19
 
 
Сообщения:127
Если коротко попробовать объяснить.

Есть класс контроллера который указан в fxml.
public class AppController {
    @FXML
    private AnchorPane rootPane;

    public AppController() {
        System.out.println(rootPane);
        "От сюда, т.е. из конструктора класса нельзя обратится к FXML полям. Точнее можно но получим null, FXML еще не инициализирован."
    }

    @FXML
    private void initialize() {
        System.out.println(rootPane);
        "От сюда можно обратится к FXML полям, происходит инициализация FXML"
    }
}



public static TextArea console_reader;

Я так понял все программируешь на public static и Синглтоны используешь наверно много? Это не дело! Много ошибок всегда будет! Не понимая где что инициализировано уже, а где нет. Так ты постоянно будешь ловить всякие ошибки. @FXML должны быть закрыты, какой толк что они открыты и статичны?
Изменен:30 мая 2020 17:58
 
 
Сообщения:13
Вообще, я редко public static использую. Но мне нужно было вызвать элемент, а я не знал как
Спасибо
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет