在FXML-javafx中将TableView项与observeList绑定
我无法用FXML中的在FXML-javafx中将TableView项与observeList绑定,java,javafx,fxml,Java,Javafx,Fxml,我无法用FXML中的observeList绑定TableView项 当我设置materialTable.setItems(materialDataObservableList)时,一切正常在按钮单击事件中。 但我不想让button知道TableView,所以我想将materialTable.items绑定到materialDataObservableList属性 我做错了什么? 或者也许我不明白绑定是如何工作的 谢谢你的帮助 <GridPane maxHeight="-Infinity"
observeList
绑定TableView
项
当我设置materialTable.setItems(materialDataObservableList)时,一切正常代码>在按钮单击事件中。
但我不想让button知道TableView
,所以我想将materialTable.items
绑定到materialDataObservableList
属性
我做错了什么?
或者也许我不明白绑定是如何工作的
谢谢你的帮助
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="464.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.xxx.sm.frontend.fx.MainSceneController">
/*
*/
<children>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button fx:id="getMaterialsButton" mnemonicParsing="false" onAction="#getMaterialsButton" text="Get materials" />
<TableView fx:id="materialTable" editable="true" prefHeight="413.0" prefWidth="600.0" items="${materialDataObservableList}" >
//Columns here
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
</children>
</VBox>
</children>
/*
*/
//这里的栏目
public类主场景控制器{
私人观察者材料观察者;
公共桌面视图材料;
公共按钮getMaterialsButton;
public void getMaterialsButton(){
getMaterialsFromRESTController();
}
私有void getMaterialsFromRESTController(){
MaterialClient controller=新MaterialClient();
试一试{
materialDataObservableList=FXCollections.observableArrayList(controller.getMaterialas());
}捕获(IOE异常){
System.out.println(“未能连接到RESTController”);
}
//materialTable.setItems(materialDataObservableList);
}
公共观察列表getMaterialDataObservableList(){
返回物料数据表;
}
}
如果您正在从mainsecenecontroller
的构造函数调用getMaterialsFromRESTController()
(因此只要控制器可用于fxmloader
),则
会有用的。(注意,您可以使用${controller.property}
访问控制器的属性)
如果没有,可以按如下方式修改控制器以使其正常工作:
public class MainSceneController {
private final ObservableList<MaterialData> materialDataObservableList
= FXCollections.observableArrayList();
public TableView materialTable;
public Button getMaterialsButton;
public void getMaterialsButton() {
getMaterialsFromRESTController();
}
private void getMaterialsFromRESTController() {
MaterialClient controller = new MaterialClient();
try {
materialDataObservableList.setAll(controller.getMaterias());
} catch (IOException e) {
System.out.println("Failed to connect to RESTController");
}
}
public ObservableList<MaterialData> getMaterialDataObservableList() {
return materialDataObservableList;
}
}
谢谢,这对我帮助很大!谢谢你的回答。我在TableController
中添加了initialize()
方法,以便在不单击按钮的情况下加载项目。代码在对某人有帮助的情况下可用。
public class MainSceneController {
private final ObservableList<MaterialData> materialDataObservableList
= FXCollections.observableArrayList();
public TableView materialTable;
public Button getMaterialsButton;
public void getMaterialsButton() {
getMaterialsFromRESTController();
}
private void getMaterialsFromRESTController() {
MaterialClient controller = new MaterialClient();
try {
materialDataObservableList.setAll(controller.getMaterias());
} catch (IOException e) {
System.out.println("Failed to connect to RESTController");
}
}
public ObservableList<MaterialData> getMaterialDataObservableList() {
return materialDataObservableList;
}
}
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
public class TableController {
private final ObservableList<Item> items = FXCollections.observableArrayList();
@FXML
private void loadItems() {
items.setAll(createItems());
}
private List<Item> createItems() {
return IntStream.rangeClosed(1, 100)
.mapToObj(i -> "Item "+i)
.map(Item::new)
.collect(Collectors.toList());
}
public ObservableList<Item> getItems() {
return items ;
}
public static class Item {
private final StringProperty name = new SimpleStringProperty();
public Item(String name) {
setName(name);
}
public final StringProperty nameProperty() {
return this.name;
}
public final java.lang.String getName() {
return this.nameProperty().get();
}
public final void setName(final java.lang.String name) {
this.nameProperty().set(name);
}
}
}
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class BindTableItemsTest extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("BindTableItemsExample.fxml"));
primaryStage.setScene(new Scene(loader.load(), 600, 600));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}