gpt4 book ai didi

java - 在 FXML 中使用 ObservableList 绑定(bind) TableView 项目 - Java FX

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:19 24 4
gpt4 key购买 nike

我无法将 TableView 项与 FXML 中的 ObservableList 绑定(bind)。

当我在按钮点击事件中设置 materialTable.setItems(materialDataObservableList); 时一切正常。但我不想让按钮知道 TableView 所以我想将 materialTable.items 绑定(bind)到 materialDataObservableList 属性。

我做错了什么?或者我可能不明白绑定(bind)是如何工作的...

感谢您的帮助!

<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()(因此它会在 Controller 对 FXMLLoader 可用时立即初始化) >), 然后

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

会起作用。 (请注意,您使用 ${controller.property} 访问 Controller 的属性。)

如果没有,你可以如下修改 Controller 使其工作:

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

关于java - 在 FXML 中使用 ObservableList 绑定(bind) TableView 项目 - Java FX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41663587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com