Dan*_*aro 1 java data-binding javafx javafx-2 fxml
说我有一个控制器
@FXML private ObservableList<String> myStrings = FXCollections.observableArrayList();
Run Code Online (Sandbox Code Playgroud)
是否可以编写任何FXML,它将ListView myStrings与其项目连接起来?
我的第一次尝试是:
<ListView>
<items fx:id="myStrings"/>
</ListView>
Run Code Online (Sandbox Code Playgroud)
但是这种抱怨fx:id在那个位置上是无效的.我也试过了
<ListView items="${controller.myStrings}"/>
Run Code Online (Sandbox Code Playgroud)
......但它无法解决这个问题.
<ListView fx:id="myStringsListView"/>
// In controller
@FXML private ListView<String> myStringsListView;
@FXML public void initialize() {
myStringsListView.setItems(myStrings);
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在正在做的事情,但是间接和样板的数量在这里伤害了我.
以下作品
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.ListView?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="ListViewController">
<center>
<ListView items="${controller.myStrings}" />
</center>
</BorderPane>
Run Code Online (Sandbox Code Playgroud)
使用以下控制器(主要区别,我认为,您要么没有为列表定义访问器方法,要么将其命名为错误):
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 ;
}
}
Run Code Online (Sandbox Code Playgroud)
这个快速测试:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
产生