【问题标题】:Having an issue with javafx objects losing reference once they're put into an array将 javafx 对象放入数组后会丢失引用的问题
【发布时间】:2014-10-25 14:15:09
【问题描述】:

所以我试图在我的控制器类中修改一些圆圈,并将这些圆圈链接到我的 fxml 文件圆圈但是当我尝试将它们添加到圆圈数组以便于管理时,它们似乎失去了参考.例如我有:

@FXML
private Circle circle1 = new Circle();

public void addNumber(ActionEvent event){
circle1.setLayoutX(355.0);
circle1.setLayoutY(100.0);
circle1.setVisbility(true);
}

上述方法成功地在给定坐标中弹出一个圆。但是以下不起作用:

@FXML
private Circle circle1 = new Circle();

@FXML
private Circle[] c = {circle1};

public void addNumber(ActionEvent event){
c[0].setLayoutX(355.0);
c[0].setLayoutY(100.0);
c[0].setVisbility(true);
}

这行不通!试过array试过arraylist试过linkedlist,对circle1的引用就丢失了。我是 JAVAFX 的菜鸟,所以这可能是一个简单的解决方法,但我尝试了一些研究,尝试了不同的实现来让它工作,但我似乎找不到解决方案。 任何帮助将不胜感激!

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

    您正在用@FXML 标记的字段中创建实例,这是错误的,加载 FXML 时会覆盖该字段。这也是数组内容不起作用的原因,因为数组中的元素从未附加到场景图

    【讨论】:

    • 好吧,澄清一下,circle1 的@FXML 很好,但不在 circle[] 上,明白了。感谢您的回复!
    • 初始化带有@FXML标记的字段是不正确的
    【解决方案2】:

    这个SSCCE 应该提供足够的信息来帮助您入门。

    给定以下 FXML 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.shape.*?>
    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    
    
    <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" 
          prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" 
          xmlns:fx="http://javafx.com/fxml/1" 
          fx:controller="yourapplication.FXMLDocumentController">
    
        <children>
            <Button layoutX="22.0" layoutY="31.0" mnemonicParsing="false" 
             onAction="#addNumber" text="Button" />
    
            <Circle fx:id="circle1" fill="DODGERBLUE" layoutX="56.0" layoutY="118.0" 
                    radius="34.0" stroke="BLACK" strokeType="INSIDE" visible="false" />
        </children>
    </Pane>
    

    以及以下控制器代码:

    public class FXMLDocumentController {
    
        @FXML
        private Circle circle1;
        private Circle[] c;
    
        public void initialize() {
            c = new Circle[] { circle1 };
        }
    
        public void addNumber(ActionEvent event) {
            c[0].setLayoutX(355.0);
            c[0].setLayoutY(100.0);
            c[0].setVisible(true);
        }
    }
    

    你应该得到你想要的结果。

    注意事项:

    • 使用 FXML 注释将变量绑定到 FXML 文件中的同名元素。
    • 未在 FXML 文件中定义的变量不需要 FXML 注释。
    • 我不认为像数组这样的原语可以定义为 FXML。
    • 应该在initialize 方法中设置对圆的引用,因为这是在变量绑定到 FXML 文件中的元素之后调用的。
    • 如果使用FXML 注释标记Node 变量,则无需在控制器代码中设置引用,因为加载FXML 文件时这将被覆盖(这是问题的根源,请参阅 Tomsontoms 的答案)。

    【讨论】:

    • 谢谢!现在你提到它是完全有道理的,似乎有点明显我应该在一个名为“initialize”的方法中初始化数组,lol idk 我是怎么错过的。也非常感谢您提供的额外提示!非常有用,因为我昨天刚开始使用 javafx!是的,数组肯定不能在 fxml 中定义,现在我应该知道,因为我试过了哈哈
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多