ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

将TableView项目与FXML中的ObservableList绑定-Java FX

2019-11-11 22:00:41  阅读:235  来源: 互联网

标签:javafx fxml java


我无法将TableView项目与FXML中的ObservableList绑定.

当我设置materialTable.setItems(materialDataObservableList)时,一切正常.在按钮单击事件.
但是我不想让按钮知道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 class MainSceneController {

    private ObservableList<MaterialData> materialDataObservableList;
    public TableView materialTable;
    public Button getMaterialsButton;

    public void getMaterialsButton() {
        getMaterialsFromRESTController();
    }

    private void getMaterialsFromRESTController() {
        MaterialClient controller = new MaterialClient();
        try {
            materialDataObservableList = FXCollections.observableArrayList(controller.getMaterias());
        } catch (IOException e) {
            System.out.println("Failed to connect to RESTController");
        }
        //materialTable.setItems(materialDataObservableList);
    }

    public ObservableList<MaterialData> getMaterialDataObservableList() {
        return materialDataObservableList;
    }
}

解决方法:

如果要从MainSceneController的构造函数中调用getMaterialsFromRESTController()(因此,一旦控制器可用于FXMLLoader,它就会被初始化),然后

<TableView fx:id="materialTable" editable="true" prefHeight="413.0" prefWidth="600.0" 
    items="${controller.materialDataObservableList}" >

将工作. (请注意,您使用${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;
    }

}

然后上面的FXML应该可以工作.

这是一个SSCCE:

BindTableItemsExample.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="TableController">
    <center>
        <TableView items="${controller.items}">
            <columns>
                <TableColumn text="Item">
                    <cellValueFactory><PropertyValueFactory property="name" /></cellValueFactory>
                </TableColumn>
            </columns>
        </TableView>
    </center>
    <bottom>
        <Button text="Load" onAction="#loadItems" BorderPane.alignment="center" >
            <BorderPane.margin>
                <Insets top="5" left="5" right="5" bottom="5"/>
            </BorderPane.margin>
        </Button>
    </bottom>
</BorderPane>

TableController.java:

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

    }
}

BindTableItemsTest.java(应用程序类):

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

标签:javafx,fxml,java
来源: https://codeday.me/bug/20191111/2022684.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有