在javafx中@FXML公共静态变量?

时间:2014-10-23 11:14:02

标签: javafx javafx-8 scenebuilder netbeans-8

我在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:抱歉我的英文不好

2 个答案:

答案 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