定义 ComboBoxTableCell 和 ComboBox 节点 FXML
Defining a ComboBoxTableCell and ComboBox nodes FXML
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.util.Callback;
public class ComboBoxTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
private T[] nodes;
public void setNodes(T[] nodes) {
this.nodes = nodes;
}
public T[] getNodes() {
return nodes;
}
@Override
public TableCell<S, T> call(TableColumn<S, T> column) {
if (nodes == null) {
return new ComboBoxTableCell<S, T>();
}
return new ComboBoxTableCell<S, T>(nodes);
}
}
我写这篇 class 是为了在 fxml 中声明 ComboBoxTableCells。这就是我为 table 细胞声明细胞工厂的方式:
<TableColumn prefWidth="50" text="Grade">
<cellFactory>
<ComboBoxTableCellFactory />
<nodes>
//How would i declare nodes?
</nodes>
</cellFactory>
</TableColumn>
我的问题是,如何为组合框声明节点数组。显然它将 运行 与一个空数组,但我希望能够在 FXML 中声明节点。那么我会在两个节点标签之间放什么呢?一个例子是成绩列,其中 ComboBox 将填充许多单个字符串,您必须从中选择一个成绩。
编辑:将 class 更改为:
import javafx.collections.ObservableList;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.util.Callback;
public class ComboBoxTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
private ObservableList<T> nodes;
public void setNodes(ObservableList<T> nodes) {
this.nodes = nodes;
}
public ObservableList<T> getNodes() {
return nodes;
}
@Override
public TableCell<S, T> call(TableColumn<S, T> column) {
if (nodes != null) {
return new ComboBoxTableCell<S, T>(nodes);
}
return new ComboBoxTableCell<S, T>();
}
}
并且:
<TableColumn prefWidth="50" text="Grade">
<cellFactory>
<ui.view.ComboBoxTableCellFactory />
<nodes>
<FXCollections fx:factory="observableArrayList">
//don't know how to declare the nodes here!
</FXCollections>
</nodes>
</cellFactory>
</TableColumn>
我只是不知道如何声明节点!
基本上,我正在尝试这样做:
ObservableList<String> values = FXCollections.observableArrayList("A", "B", "C");
TableColumn<String, String> gradeColumn = new TableColumn<>(tableView);
gradeColumn.setCellFactory(ComboBoxTableCell.forTableColumn(new DefaultStringConverter(), values));
在 FXML 中。
如果您正在创建 String
,您可以执行
<TableColumn prefWidth="50" text="Grade">
<cellFactory>
<ui.view.ComboBoxTableCellFactory />
<nodes>
<FXCollections fx:factory="observableArrayList">
<String fx:value="A"/>
<String fx:value="B"/>
<String fx:value="C"/>
</FXCollections>
</nodes>
</cellFactory>
</TableColumn>
有关详细信息,请参阅 FXML 简介的 "Instance declarations" 部分。 (请注意,有点违反直觉,您必须显式导入 String
和 <?import java.lang.String?>
。)
好的,我明白了为什么它不起作用。默认情况下,组合框不显示,您必须单击它才能显示。我没有意识到 Table 视图不可编辑,因此当我单击编辑时,组合框没有显示。现在一切正常!感谢您的帮助。
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.util.Callback;
public class ComboBoxTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
private T[] nodes;
public void setNodes(T[] nodes) {
this.nodes = nodes;
}
public T[] getNodes() {
return nodes;
}
@Override
public TableCell<S, T> call(TableColumn<S, T> column) {
if (nodes == null) {
return new ComboBoxTableCell<S, T>();
}
return new ComboBoxTableCell<S, T>(nodes);
}
}
我写这篇 class 是为了在 fxml 中声明 ComboBoxTableCells。这就是我为 table 细胞声明细胞工厂的方式:
<TableColumn prefWidth="50" text="Grade">
<cellFactory>
<ComboBoxTableCellFactory />
<nodes>
//How would i declare nodes?
</nodes>
</cellFactory>
</TableColumn>
我的问题是,如何为组合框声明节点数组。显然它将 运行 与一个空数组,但我希望能够在 FXML 中声明节点。那么我会在两个节点标签之间放什么呢?一个例子是成绩列,其中 ComboBox 将填充许多单个字符串,您必须从中选择一个成绩。
编辑:将 class 更改为:
import javafx.collections.ObservableList;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.util.Callback;
public class ComboBoxTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
private ObservableList<T> nodes;
public void setNodes(ObservableList<T> nodes) {
this.nodes = nodes;
}
public ObservableList<T> getNodes() {
return nodes;
}
@Override
public TableCell<S, T> call(TableColumn<S, T> column) {
if (nodes != null) {
return new ComboBoxTableCell<S, T>(nodes);
}
return new ComboBoxTableCell<S, T>();
}
}
并且:
<TableColumn prefWidth="50" text="Grade">
<cellFactory>
<ui.view.ComboBoxTableCellFactory />
<nodes>
<FXCollections fx:factory="observableArrayList">
//don't know how to declare the nodes here!
</FXCollections>
</nodes>
</cellFactory>
</TableColumn>
我只是不知道如何声明节点!
基本上,我正在尝试这样做:
ObservableList<String> values = FXCollections.observableArrayList("A", "B", "C");
TableColumn<String, String> gradeColumn = new TableColumn<>(tableView);
gradeColumn.setCellFactory(ComboBoxTableCell.forTableColumn(new DefaultStringConverter(), values));
在 FXML 中。
如果您正在创建 String
,您可以执行
<TableColumn prefWidth="50" text="Grade">
<cellFactory>
<ui.view.ComboBoxTableCellFactory />
<nodes>
<FXCollections fx:factory="observableArrayList">
<String fx:value="A"/>
<String fx:value="B"/>
<String fx:value="C"/>
</FXCollections>
</nodes>
</cellFactory>
</TableColumn>
有关详细信息,请参阅 FXML 简介的 "Instance declarations" 部分。 (请注意,有点违反直觉,您必须显式导入 String
和 <?import java.lang.String?>
。)
好的,我明白了为什么它不起作用。默认情况下,组合框不显示,您必须单击它才能显示。我没有意识到 Table 视图不可编辑,因此当我单击编辑时,组合框没有显示。现在一切正常!感谢您的帮助。