【问题标题】:@FXML public static vars in javafx? [duplicate]javafx中的@FXML公共静态变量? [复制]
【发布时间】:2014-12-19 01:05:44
【问题描述】:

我在 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:对不起我的英语不好

【问题讨论】:

    标签: javafx javafx-8 scenebuilder netbeans-8


    【解决方案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

    【讨论】:

      【解决方案2】:

      您不应在此处使用静态字段。您的控制器属于一个视图,每次 FXML 加载器创建视图时,都会创建视图中所有节点的新实例。因此,通过调用 FXML 加载器 2 次,您将收到 2 个视图实例。此外,每当您使用 FXML 查看器加载视图时,都会创建控制器类的新实例。通过使用静态字段,您将覆盖旧控制器实例的值,这将导致可怕的错误。这里简单介绍一下static关键字:What does the 'static' keyword do in a class?

      如果您只是删除“静态”,它将起作用。 您应该向控制器类添加 getter 和 setter 方法并将该字段标记为私有,而不是使用公共字段:Why use getters and setters?

      【讨论】:

      • 我正在尝试做与我发布的其他答案类似的事情。我将其更改为仅公开,但仍然无法正常工作...谢谢
      • 我会进一步讨论public:制作 UI 组件private 并且不要将它们暴露在控制器之外(没有 get/set 方法)。如果您需要从文本字段中公开文本,请公开其textProperty()
      猜你喜欢
      • 2014-02-25
      • 2015-03-19
      • 2011-09-23
      • 2014-03-15
      • 1970-01-01
      • 2015-12-02
      • 2012-02-03
      • 2015-04-07
      相关资源
      最近更新 更多