我在javafx中介绍,我发现它非常有趣。但是我遇到了一个我无法解决的问题。 在Hello World的最简单的情况下,我不能像这样放置@FXML public static var:
public class FXMLDocumentController implements Initializable
{
@FXML
public static Label label;
@FXML
private void handleButtonAction(ActionEvent event)
{
System.out.println("You clicked me!");
label.setText("Hello World!");
}
}
如果我将其更改为私有,则可以正常工作。 我想让这个vars公开的原因是因为我正在使用不同的控制器来获取不同的视图(在我的真实应用程序中),我想在他们之间进行通信。
PS:抱歉我的英文不好
答案 0 :(得分:3)
您不应在此处使用静态字段。您的控制器属于一个视图,每次FXML Loader创建视图时,都会创建视图中所有节点的新实例。因此,通过调用FXML Loader 2次,您将收到2个视图实例。此外,只要使用FXML查看器加载视图,就会创建控制器类的新实例。通过使用静态字段,您将覆盖旧控制器实例的值,这将以可怕的错误结束。以下是static关键字的简短介绍:What does the 'static' keyword do in a class?
如果你只是删除"静态"它会工作。 您应该将getter和setter方法添加到控制器类中,而不是使用公共字段,并将该字段标记为私有:Why use getters and setters?
答案 1 :(得分:1)
我想做类似这样的事情: 我正在使用标签,我有两个控制器:
FXML_Tab1Controller.java:
public class FXML_Tab1Controller implements Initializable {
FXML_Tab2Controller tab2controller;
@FXML public Label Label1;
@FXML public TextField TextField1;
@FXML public Button Button1;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
@FXML private void actionButton1(ActionEvent event)
{
Label1.setText(tab2controller.TextField2.getText());
}
}
FXML_Tab2Controller.java:
public class FXML_Tab2Controller implements Initializable {
FXML_Tab1Controller tab1controller;
@FXML public Label Label2;
@FXML public TextField TextField2;
@FXML public Button Button2;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
@FXML private void actionButton2(ActionEvent event){
Label2.setText(tab1controller.TextField1.getText());
}
}
像那个视频类似的东西:
https://www.youtube.com/watch?v=XLVx46ycxco