Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用id在JavaFx中获取元素?_Java_Javafx_Fxml - Fatal编程技术网

如何使用id在JavaFx中获取元素?

如何使用id在JavaFx中获取元素?,java,javafx,fxml,Java,Javafx,Fxml,我是FXML新手,我正在尝试使用开关为所有按钮点击创建一个处理程序。但是,为了做到这一点,我需要使用和id获取元素。我尝试了以下方法,但出于某种原因(可能是因为我在控制器类中而不是在主类中进行),我得到了一个堆栈溢出异常 public class ViewController { public Button exitBtn; public ViewController() throws IOException { Parent root = FXMLLoade

我是FXML新手,我正在尝试使用
开关
为所有按钮点击创建一个处理程序。但是,为了做到这一点,我需要使用和id获取元素。我尝试了以下方法,但出于某种原因(可能是因为我在控制器类中而不是在主类中进行),我得到了一个堆栈溢出异常

public class ViewController {
    public Button exitBtn;

    public ViewController() throws IOException {
         Parent root = FXMLLoader.load(getClass().getResource("mainWindow.fxml"));
         Scene scene = new Scene(root);

         exitBtn = (Button) scene.lookup("#exitBtn");
    }
}
那么,如何使用元素的id作为引用来获取元素(例如按钮)

按钮的fxml块为:

<Button fx:id="exitBtn" contentDisplay="CENTER" mnemonicParsing="false"
        onAction="#handleButtonClick" text="Exit" HBox.hgrow="NEVER" HBox.margin="$x1"/>

使用控制器类,这样就不需要使用查找。
FXMLLoader
将为您将字段注入控制器。注入保证在调用
initialize()
方法(如果有)之前发生

public class ViewController {

    @FXML
    private Button exitBtn ;

    @FXML
    private Button openBtn ;

    public void initialize() {
        // initialization here, if needed...
    }

    @FXML
    private void handleButtonClick(ActionEvent event) {
        // I really don't recommend using a single handler like this,
        // but it will work
        if (event.getSource() == exitBtn) {
            exitBtn.getScene().getWindow().hide();
        } else if (event.getSource() == openBtn) {
            // do open action...
        }
        // etc...
    }
}
在FXML的根元素中指定控制器类:


最后,从控制器类以外的类(可能但不一定是
应用程序
类)加载FXML


在混合使用
id
fx:id
标记时,请使用a<代码>查找基于
id
fx:id
用于注入控制器类。@James\D这是一个控制器class@sillyfly好的,但仍然是。我该怎么做?我尝试的方法不起作用,因为我无法从fxml文件中获取场景。为什么要在控制器中加载fxml?这毫无意义:您创建了一个加载FXML的控制器实例,在此期间创建了另一个控制器实例……我想说的是,例如,您定义为
private button exitBtn的按钮不是实际的exitBtn。这只是一个按钮参考。因此,如果另一个按钮处理程序(即
openBtn
)指向相同的方法,则该按钮将
hide()
,而不是exit按钮no,因为在这种情况下
if
中的条件将计算为false。(Java中的所有对象都是通过引用访问的:如果您使用查找,这在控制器中非常困难,您仍然会有对按钮的引用。)好的,我明白了。我还没有意识到使用与
fx:id=“exitBtn”
中定义的相同的变量名作为引用
fx:id
指定FXML加载器将元素创建的对象注入的字段名。如果您熟悉iOS开发,
fx:id
有效地为对象创建了苹果所称的“出口”。如果在控制器类中定义具有相同名称的字段,
fxmloader
将自动将对象实例映射到该字段。
Parent root = FXMLLoader.load(getClass().getResource("path/to/fxml"));
Scene scene = new Scene(root);   
// etc...