Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在FXML-javafx中将TableView项与observeList绑定_Java_Javafx_Fxml - Fatal编程技术网

在FXML-javafx中将TableView项与observeList绑定

在FXML-javafx中将TableView项与observeList绑定,java,javafx,fxml,Java,Javafx,Fxml,我无法用FXML中的observeList绑定TableView项 当我设置materialTable.setItems(materialDataObservableList)时,一切正常在按钮单击事件中。 但我不想让button知道TableView,所以我想将materialTable.items绑定到materialDataObservableList属性 我做错了什么? 或者也许我不明白绑定是如何工作的 谢谢你的帮助 <GridPane maxHeight="-Infinity"

我无法用FXML中的
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);
    }
}