Добавление TextFlow к контроллеру FXML делает GUI пустым - PullRequest
0 голосов
/ 29 октября 2018

Итак, я сделал базовое приложение, которое обычно выглядит как ...

enter image description here

Но если я добавлю ссылку на компонент FXML TextFlow (fx: id = "tofl") в классе контроллера, графический интерфейс станет пустым, как ...

enter image description here

Пожалуйста, объясните, почему это происходит. Мой код выглядит следующим образом:

main.FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.TextFlow?>

<fx:root prefHeight="389.0" prefWidth="732.0" styleClass="grey" stylesheets="@CSS.css" type="AnchorPane" xmlns:fx="http://javafx.com/fxml">
<TextFlow fx:id="tofl" layoutX="14.0" layoutY="14.0" prefHeight="299.0" prefWidth="703.0" />
<Button fx:id="addBtn" layoutX="596.0" layoutY="320.0" mnemonicParsing="false" text="Add new Text block" />
<TextField fx:id="txt" layoutX="14.0" layoutY="320.0" prefHeight="25.0" prefWidth="572.0" />
<CheckBox fx:id="italic" layoutX="14.0" layoutY="360.0" mnemonicParsing="false" styleClass="chckbox" text="Italic" />
<CheckBox fx:id="bold" layoutX="104.0" layoutY="360.0" mnemonicParsing="false" text="Bold" />
<CheckBox fx:id="underline" layoutX="180.0" layoutY="360.0" mnemonicParsing="false" text="Underline" />
<ChoiceBox fx:id="color" layoutX="270.0" layoutY="356.0" prefHeight="25.0" prefWidth="121.0" />
<ChoiceBox fx:id="size" layoutX="399.0" layoutY="356.0" prefHeight="25.0" prefWidth="121.0" />
</fx:root>

mainController.java

package textflow;

import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class mainController extends AnchorPane {

    @FXML TextFlow tofl; //Problem here. If this line exists, the GUI is blank white. If I remove it, the GUI shows up. The program doesn't throw ANY errors, so it might just be a bug (either in NetBeans, or my head)
    @FXML TextField txt;
    @FXML Button addBtn;
    @FXML CheckBox italic;
    @FXML CheckBox bold;
    @FXML CheckBox underline;
    @FXML ChoiceBox color;
    @FXML ChoiceBox size;

    public mainController() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);
        try {
            fxmlLoader.load();            
        } catch (IOException exception) {
        }
    }  

}

TextFlow.java - основной класс

package textflow;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

 public class TextFlow extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        mainController customControl = new mainController();
        stage.setScene(new Scene(customControl));
        stage.setTitle("Custom Control");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

"@FXML TextFlow tofl;" В mainController.java есть то, что вызывает проблемы. Я удаляю это, все хорошо. Я добавляю это, это пусто.

1 Ответ

0 голосов
/ 29 октября 2018

Посмотрите на импорт в mainController.java:

Они не содержат импорт для javafx.scene.text.TextFlow, и вместо них используется textflow.TextFlow. Вам нужно добавить импорт в javafx.scene.text.TextFlow. Кроме того, рассмотрите возможность переименования класса TextFlow. Использование тех же имен типов, что и типы в используемом API, может легко привести к путанице.

Когда выполняется конструктор mainController, файл fxml обрабатывается до тех пор, пока FXMLLoader не попытается внедрить экземпляр javafx.scene.text.TextFlow в поле tofl, что приводит к IOException из-за несовпадающих типов.

Поскольку вы просто игнорируете исключение в предложении catch вместо его обработки, конструктор завершается нормально, и частично загруженный узел добавляется в вашу сцену. Обычно лучше, по крайней мере, напечатать исключение, если только вы не знаете, что исключение не вызовет (или не укажет) проблему, поскольку это значительно облегчает отладку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...