JavaFX不能在Final TextField上设置text()

时间:2016-03-24 11:53:52

标签: java javafx java-8 textfield settext

如果将变量TextField设置为final,我无法设置TextField但如果我将其更改为private或public,则会更改textfiel的文本。我认为最后只是不允许创建另一个类实例。我尝试打印私有和最终TextField的HashCode,但它们没有改变。所以我很好奇为什么我必须私有或公共TextField到SetText()。

public class SearchController {

    @FXML
    final TextField textfieldSelectedDirectory = new TextField();
    @FXML
    private Button path;
    @FXML
    private Label pathlabel;
    @FXML
    final TextField searchfield = new TextField();

    public String getSearchfield() {

        return searchfield.getText();
    }

    private MainApp mainApp;
    private Stage stage;

    public SearchController() {

    }

    @FXML
    private void Index() {

        IndexFiles.index();

    }

    @FXML
    private void search() {

        SearchFiles().Search();
        System.out.println(searchfield.hashCode());

        System.out.println("Somtu");

        System.out.println(getSearchfield());

    }

    private void setPath(File selectedDirectory) {
        String dir = selectedDirectory.getAbsolutePath();


        pathlabel.setText(dir);

        textfieldSelectedDirectory.clear();

        // textfieldSelectedDirectory.getParent().layout();

        System.out.println(textfieldSelectedDirectory.getText());
    }
}

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

FXMLLoader加载FXML文件时,

  1. 创建由fx:controller
  2. 指定的控制器类的实例
  3. 创建FXML文件中元素描述的类的实例(即<Button>创建Button实例等),并设置其属性
  4. 对于具有fx:id属性的元素,在创建的控制器实例中设置相应的@FXML - 注入字段
  5. 注册事件处理程序等
  6. 调用控制器上的initialize()方法
  7. 由于在构造函数调用完成后 之后设置了<{1}}字段,因此它们不能是@FXML。此外,初始化它们没有意义,因为它们将由final设置:您应该永远不会初始化FXMLLoader - 带注释的字段。

    所以你的字段声明应该是

    @FXML

    等,(你也可以,也可能应该制作这些@FXML TextField textfieldSelectedDirectory ; )。

    private关键字仅表示为变量分配一次值。虽然这在我所描述的设置中技术上是正确的(该字段只被赋值一次,由final),但编译器需要知道这一点才能编译代码,因为它不可能知道FXMLLoader将对您的控制器类的实例做什么,您无法创建这些字段FXMLLoader

答案 1 :(得分:0)

您不能将final变量与FXML注射结合使用。使用FXML,将在构造函数调用之后创建字段。因此,您必须删除new TextField()初始化。 编译器不会让你这么做。