【问题标题】:Defining a ComboBoxTableCell and ComboBox nodes FXML定义 ComboBoxTableCell 和 ComboBox 节点 FXML
【发布时间】:2015-02-21 22:29:56
【问题描述】:
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);
    }

}

我已经编写了这个类,用于在 fxml 中声明 ComboBoxTableCells。这就是我为表格单元声明单元工厂的方式:

<TableColumn prefWidth="50" text="Grade">
    <cellFactory>
        <ComboBoxTableCellFactory />
        <nodes>
            //How would i declare nodes?
        </nodes>
    </cellFactory>
</TableColumn>

我的问题是,我将如何为组合框声明一个节点数组。显然它将使用一个空数组运行,但我希望能够在 FXML 中声明节点。那么我会在两个节点标签之间放什么?一个示例是 Grade 列,其中 ComboBox 将填充许多单个字符串,您必须从中选择一个等级。

编辑:将课程更改为:

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 中。

【问题讨论】:

  • 你能用List代替数组吗?

标签: java combobox javafx fxml


【解决方案1】:

如果你正在创建Strings,你可以这样做

<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&lt;?import java.lang.String?&gt;。)

【讨论】:

  • 非常感谢。由于某种原因它不起作用,没有呈现组合框。但是,该列表已成功填充。我还注意到ComboBoxTableCellFactory类的调用方法被调用了28次,不知道为什么!
  • 我可以从控制器填充 FXCollection 以使用枚举或字符串列表填充组合框吗? @James_D
【解决方案2】:

好的,我知道为什么它不起作用了。默认情况下,组合框不显示,您必须单击它才能显示。我没有意识到,但表格视图不可编辑,所以当我单击编辑时,组合框没有显示。现在一切正常!感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多