JavaFX将控制器变量绑定到组件属性
假设我有一个控制器JavaFX将控制器变量绑定到组件属性,java,javafx,data-binding,javafx-2,fxml,Java,Javafx,Data Binding,Javafx 2,Fxml,假设我有一个控制器 @FXML private ObservableList<String> myStrings = FXCollections.observableArrayList(); 但这会导致fx:id在该位置无效。我也试过了 <ListView items="${controller.myStrings}"/> …但它无法解析该值 请不要发布此解决方案: //内部控制器 @FXML私有ListView MyStringListView; @FXML公
@FXML private ObservableList<String> myStrings = FXCollections.observableArrayList();
但这会导致fx:id
在该位置无效。我也试过了
<ListView items="${controller.myStrings}"/>
…但它无法解析该值
请不要发布此解决方案:
//内部控制器
@FXML私有ListView MyStringListView;
@FXML公共无效初始化(){
setItems(myStrings);
}
这就是我现在正在做的事情,但是这里的间接和样板的数量伤害了我
使用以下控制器(我认为主要区别在于您没有为列表定义访问器方法,或者命名不正确):
产生
以下工作
使用以下控制器(我认为主要区别在于您没有为列表定义访问器方法,或者命名不正确):
产生
要在
FXML中执行此操作,您需要有一组确定的值。如果要更改列表视图
,最好使用code而不是FXML
来处理列表视图
。这行代码是错误的:@FXML private observebleList myStrings=FXCollections.observearraylist()
控制器中字段上的@FXML
注释表示该字段由fxmloader
初始化;因此,在代码中初始化它总是一个错误:要么注释是冗余的,要么初始化是冗余的。FXML中的${x.y}
语法解析为属于FXML命名空间的某个成员x
的名为y
的属性(在通常的JavaBeans意义上)。FXML命名空间中填充了具有fx:id
属性的元素,以及一些特权对象,如控制器
、资源
、和位置
。因此,${controller.myStrings}
如果您有一个名为myStrings
的JavaBeans样式属性,则该属性可以工作。要在FXML
中执行此操作,需要有一组确定的值。如果要更改列表视图
,最好使用code而不是FXML
来处理列表视图
。这行代码是错误的:@FXML private observebleList myStrings=FXCollections.observearraylist()
控制器中字段上的@FXML
注释表示该字段由fxmloader
初始化;因此,在代码中初始化它总是一个错误:要么注释是冗余的,要么初始化是冗余的。FXML中的${x.y}
语法解析为属于FXML命名空间的某个成员x
的名为y
的属性(在通常的JavaBeans意义上)。FXML名称空间由具有fx:id
属性的元素填充,再加上一些特权对象,如controller
、resources
和location
。因此,如果您有一个名为myStrings
的JavaBeans样式属性,则${controller.myStrings}
可以工作。
<ListView items="${controller.myStrings}"/>
<ListView fx:id="myStringsListView"/>
// In controller
@FXML private ListView<String> myStringsListView;
@FXML public void initialize() {
myStringsListView.setItems(myStrings);
}
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public class ListViewController {
private final ObservableList<String> myStrings = FXCollections.observableArrayList();
public ListViewController() {
myStrings.addAll("One", "Two", "Three");
}
public ObservableList<String> getMyStrings() {
return myStrings ;
}
}
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class ListViewItemsFromControllerTest extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
primaryStage.setScene(new Scene(FXMLLoader.load(getClass().getResource("ListViewItemsFromController.fxml"))));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}