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);
    }
}