如何在具有两个场景的JavaFXML控制器中初始化圆形对象的双数组?

时间:2015-09-01 19:13:39

标签: java javafx-2 fxml scenebuilder

我正在使用JavaFXMLGluon Scene Builder 8.0.0进行编码,以创建像素编辑器应用。我创建了两个.fxml文件,一个用于绘制工具(sample.fxml),另一个用于圆形对象(32 x 32)数组,表示LED的像素数组(PixelEditor.fxml)。两者共享相同的控制器(Controller.java)。

当用户点击Circle[][]等菜单项时,我无法在Controller.java中初始化我的32h x 32w数组。我使用4 x4数组来测试我的代码:

public void handleMenuAction(ActionEvent event) throws IOException {

   if(event.getSource() == menu32hx32w) {

  Stage pixelStage = new Stage();
  Parent pixelRoot = FXMLLoader.load(getClass().getResource("PixelEditor.fxml"));
  Scene pixelScene = new Scene(pixelRoot);
  pixelStage.setTitle("Pixel Array: 32h X 32w");
  pixelStage.setScene(pixelScene);
  pixelStage.setX(0.0);
  pixelStage.setY(0.0);
  pixelStage.show();

  Circle[][] pixelArray = {
       {R0C0, R0C1, R0C2, R0C3},
       {R1C0, R1C1, R1C2, R1C3},
       {R2C0, R2C1, R2C2, R2C3},
       {R3C0, R3C1, R3C2, R3C3},
    };
   }
}

如果我打印出阵列,我会得到:

pixelArray:
null null null null 
null null null null 
null null null null 
null null null null

当我只有一个包含所有对象的.fxml时,我可以初始化pixelArray。我使用fx:id引用圆形对象,但将它们放在一个单独的舞台和场景中似乎取消引用它们并创建一个空元素。

我不做什么?

以前,使用一个.fxml文件,我需要为Circle Objects分配值,就是在Controller.java中引用它们的fx:id,如下所示:

@FXML
private Circle
R0C0, R0C1, R0C2, R0C3,
R1C0, R1C1, R1C2, R1C3,
R2C0, R2C1, R2C2, R2C3,
R3C0, R3C1, R3C2, R3C3;

这就是我现在仍然在做的事情,但通过fx:id引用分配的属性似乎没有连接?

PixelEditor.fxml非常大,因为我有32x32 = 1024个Circle对象,即使我只是测试了第一个4x4。第一行的代码如下所示:

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

<?import javafx.geometry.*?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<Pane fx:id="panePixelLayout" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="776.0" prefWidth="776.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <children>
        <VBox prefHeight="776.0" prefWidth="776.0" style="-fx-background-color: #000000;">
            <children>
                <HBox prefHeight="24.0" prefWidth="776.0" style="-fx-background-color: #000000;">
                    <children>
                        <Circle fx:id="R0C0" fill="DODGERBLUE" onDragDetected="#onDragDetected" onMouseClicked="#pixelClicked" onMouseDragEntered="#onMouseDragEntered" onMousePressed="#onMousePressed" radius="8.0" stroke="BLACK" strokeType="INSIDE" style="-fx-fill: DARKGREY;">
                            <HBox.margin>
                                <Insets left="8.0" top="8.0" />
                            </HBox.margin>
                        </Circle>
                        <Circle fx:id="R0C1" fill="DODGERBLUE" layoutX="22.0" layoutY="22.0" onDragDetected="#onDragDetected" onMouseClicked="#pixelClicked" onMouseDragEntered="#onMouseDragEntered" onMousePressed="#onMousePressed" radius="8.0" stroke="BLACK" strokeType="INSIDE" style="-fx-fill: DARKGREY;">
                            <HBox.margin>
                                <Insets left="8.0" top="8.0" />
                            </HBox.margin>
                        </Circle>
                        <Circle fx:id="R0C2" fill="DODGERBLUE" layoutX="22.0" layoutY="22.0" onDragDetected="#onDragDetected" onMouseClicked="#pixelClicked" onMouseDragEntered="#onMouseDragEntered" onMousePressed="#onMousePressed" radius="8.0" stroke="BLACK" strokeType="INSIDE" style="-fx-fill: DARKGREY;">
                            <HBox.margin>
                                <Insets left="8.0" top="8.0" />
                            </HBox.margin>
                        </Circle>
                        <Circle fx:id="R0C3" fill="DODGERBLUE" layoutX="42.0" layoutY="22.0" onDragDetected="#onDragDetected" onMouseClicked="#pixelClicked" onMouseDragEntered="#onMouseDragEntered" onMousePressed="#onMousePressed" radius="8.0" stroke="BLACK" strokeType="INSIDE" style="-fx-fill: DARKGREY;">
                            <HBox.margin>
                                <Insets left="8.0" top="8.0" />
                            </HBox.margin>
                        </Circle>

2 个答案:

答案 0 :(得分:0)

看起来您实际上并未设置以下任何值:R0C0R0C1等。如果在创建阵列时将这些变量设置为null,即使您稍后设置,它们仍然是null

您还没有显示代码中您指定R0C0的部分,但很可能,这就是问题所在。

答案 1 :(得分:0)

jewelsea在相关问题中回答了这个问题,他在Have multiple FXML files (created in SceneBuilder), but only one controller. Does each scene load it's own copy of the controller?提供了最优秀的答案。

通过创建两个控制器,我能够初始化我的Circle [] []数组,但现在我必须在两个控制器之间传递参数,正如jewelsea通过提供的链接所描述的那样。