如果将变量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());
}
}
感谢您的回答。
答案 0 :(得分:2)
当FXMLLoader
加载FXML文件时,
fx:controller
<Button>
创建Button
实例等),并设置其属性fx:id
属性的元素,在创建的控制器实例中设置相应的@FXML
- 注入字段initialize()
方法由于在构造函数调用完成后 之后设置了<{1}}字段,因此它们不能是@FXML
。此外,初始化它们没有意义,因为它们将由final
设置:您应该永远不会初始化FXMLLoader
- 带注释的字段。
所以你的字段声明应该是
@FXML
等,(你也可以,也可能应该制作这些@FXML
TextField textfieldSelectedDirectory ;
)。
private
关键字仅表示为变量分配一次值。虽然这在我所描述的设置中技术上是正确的(该字段只被赋值一次,由final
),但编译器需要知道这一点才能编译代码,因为它不可能知道FXMLLoader
将对您的控制器类的实例做什么,您无法创建这些字段FXMLLoader
。
答案 1 :(得分:0)
您不能将final
变量与FXML注射结合使用。使用FXML,将在构造函数调用之后创建字段。因此,您必须删除new TextField()
初始化。
编译器不会让你这么做。