javafx не отображает вложенный компонент - PullRequest
0 голосов
/ 17 января 2020

В продолжение к этому посту Я реализовал часть предложенного решения.

У меня есть основная панель, и я хочу нарисовать на ней компонент другого класса ( steerwheel).

мой главный контроллер:

public class WindowController {

    @FXML SteerWheel steerwheel;
     ... other componenets..
}

мой новый компонент enet:

  public SteeringWheel() {
  myLabel = new Label();
  innerCircle = new Circle();
  backgroundCircle = new Circle();
  System.out.println("steerwheel created.");

  }

  .. other methods..

мой mainwindow.f xml файл:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import view.SteerWheel?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/9.0.1" fx:controller="view.WindowController">
   <center>
    <SteerWheel fx:id="steerwheel" />
   </center>
</BorderPane>

и мой файл steerwheel.f xml:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="view.SteerWheel"
            prefHeight="400.0" prefWidth="600.0">

    <Label fx:id="mylabel" prefHeight="30.0" prefWidth="102.0" text="mytest"  translateY="30" translateX="90">
      <StackPane >
        <Circle fx:id="innerCircle" fill="darkgray" radius="170"  />
        <Circle fx:id="backgroundCircle " fill="black"  radius="80" />
    </StackPane>

</AnchorPane>

мой основной код, который загружает файлы f xml (в файл, отличный от всех упомянутых):

public class Main extends Application {
public static Stage primaryStage;

@Override
public void start(Stage primary_stage) {
    this.primaryStage=primary_stage;
FXMLLoader fxl=new FXMLLoader();
try {
    BorderPane root = fxl.load(getClass().getResource("mainwindow.fxml").openStream());

    WindowController wc=fxl.getController(); 
    Scene scene = new Scene(root,700,700);
    primaryStage.setScene(scene);
    primaryStage.show();
} catch (IOException e) {
    e.printStackTrace();
}

Я вижу вывод конструктора, но на консоль, но компонент не отображается в окне. ОБНОВЛЕНИЕ:

Я попытался добавить вызов для файла f xml рулевого колеса в моем Window.f xml:

<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/9.0.1" fx:controller="view.WindowController">
    <center>
        <VBox maxHeight="-Infinity" prefHeight="450.0" prefWidth="400.0" BorderPane.alignment="TOP_CENTER">
        <children>
            <fx:include source="steerwheel.fxml" fx:id="steerwheel" />

        </children>
        </VBox>

    </center>

</BorderPane>

, теперь я получаю следующую ошибку:

Caused by: java.lang.IllegalArgumentException: Can not set view.steerWheel field view.WindowController.steerWheel to javafx.scene.layout.AnchorPane

1 Ответ

0 голосов
/ 19 января 2020

Я обнаружил следующий пост, описывающий ту же проблему, что и у меня: Передача данных с одного контроллера на другой в javafx. java .lang.IllegalArgumentException @fabian также ответил там, как решить проблему.

Решение, которое я реализовал: Мой основной файл f xml:

<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/9.0.1" fx:controller="view.WindowController">
    <center>
        <VBox maxHeight="-Infinity" prefHeight="450.0" prefWidth="400.0" BorderPane.alignment="TOP_CENTER">
        <children>

        <fx:include fx:id="steerwheel" source="steerwheel.fxml"  />
        </children>
        </VBox>
    </center>

</BorderPane>

In Контроллер файла f xml Я добавил объект AnchorPane, названный в честь fx: id, и переименовал объект steerWheel в steerwheelController:

public class WindowController {
    @FXML AnchorPane steerwheel;
    @FXML steerWheel steerwheelController;

Впоследствии мне пришлось использовать метод setLocation в моем main для загрузки внутреннего файла f xml (в противном случае я получил ошибку ..):

FXMLLoader fxl=new FXMLLoader();
    try {
        fxl.setLocation(getClass().getResource("Window.fxml"));
        BorderPane root = fxl.load();
        WindowController wc=fxl.getController();

Надеюсь, это кому-нибудь поможет:)

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