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中声明节点。那么我将在两个节点标签之间插入什么呢?一个示例是“成绩”列,其中将用许多单个字符串填充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中。

最佳答案

如果要创建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?>。)

关于java - 定义ComboBoxTableCell和ComboBox节点FXML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28652158/

10-13 04:08