【问题标题】:Can JavaFX TableView be partly editable?JavaFX TableView 可以部分编辑吗?
【发布时间】:2013-09-14 07:25:17
【问题描述】:

我有一个拥有两列的 JavaFX TableView。此表使用 ObservableList gasRatioMeasures 作为其模型。

public class GasRatioMeasureBean {
    private String number;
    private String measure;
    public String getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = "Measure" + (number + 1) + "(%)";
    }
    public String getMeasure() {
        return measure;
    }
    public void setMeasure(String measure) {
        this.measure = measure;
    }
}

我想将其中一个设置为可编辑,另一个设置为不可编辑。

首先我尝试了 FXML 方式:

<TableView layoutX="24.0" layoutY="122.0" prefHeight="200.0" prefWidth="215.0" fx:id="measureTableView">
    <columns>
         <TableColumn editable="false" prefWidth="100.0" sortable="false" text="No" fx:id="measureNumbersColumn" />
         <TableColumn editable="true" prefWidth="110.0" sortable="false" text="Measures" fx:id="measuresColumn" />
    </columns>
</TableView>

但这没有用。表格始终不可编辑。

我也试过java方式:

private void initMeasuresTableView() {
    measureNumbersColumn.setCellValueFactory(new PropertyValueFactory<GasRatioMeasureBean, String>("number"));
    measureNumbersColumn.setEditable(false);
    measuresColumn.setCellValueFactory(new PropertyValueFactory<GasRatioMeasureBean, String>("measure"));
    measuresColumn.setOnEditCommit(
        new EventHandler<CellEditEvent<GasRatioMeasureBean, String>>() {
            public void handle(CellEditEvent<GasRatioMeasureBean, String> measure) {
                ((GasRatioMeasureBean) measure.getTableView().getItems().get(
                measure.getTablePosition().getRow())
                ).setMeasure(measure.getNewValue());
            }
        }
    );

    measureTableView.setItems(gasRatioMeasures);
    measureTableView.setEditable(true);
}

但这也不起作用。所有表格都保持不可编辑。

如果TableColumn有editable属性,那么应该可以单独设置。

如果你知道我哪里做错了,请帮助我。谢谢!

PS:measureNumbersColumn这个列已经可以正常显示了(我还没有初始化measuresColumn的时候)。

PPS:我也试过代替 setOnEditCommit setOnEditStartsetOnEditCommit 不被调用,但setOnEditStart 可以在可编辑列中调用。

【问题讨论】:

标签: javafx-2 javafx tableview


【解决方案1】:

您没有使用支持编辑的单元工厂。你需要做的:

measureNumbersColumn.setCellFactory(TextFieldTableCell.forTableColumn()) 

这将使您的列使用TextFieldTableCell,而不是默认的TableCell。 TextFieldTableCell 支持编辑(看源码找startEdit方法)。

或者,如果您对 TextFieldTableCell 的行为不满意,您可以编写自己的 TableCell 实现,并覆盖 startEdit、cancelEdit 和 updateItem 方法。

measureNumbersColumn.setCellFactory(new Callback<TableColumn<GasRatioMeasureBean,String>, TableCell<GasRatioMeasureBean,String>>() {

    @Override
    public TableCell<GasRatioMeasureBean, String> call(
            TableColumn<GasRatioMeasureBean, String> arg0) {
        return MyOwnTableCell(); 
    }
});

【讨论】:

    【解决方案2】:

    这是您可以在 TableView 中制作可编辑列的方法。

    tblViewPerson.setEditable(true);

            // Making editable columns 
            // For ID
    
            tblColID.setCellFactory(TextFieldTableCell.forTableColumn());
    
            tblColID.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>() {
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())
                            ).setId(t.getNewValue());
                    }
                }
            );
    

    【讨论】:

    • setID是POJO类的方法吗?
    • 控制器类使表格列可编辑的方法。
    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 2012-10-05
    • 2014-10-14
    • 2017-05-24
    • 2023-03-11
    • 1970-01-01
    • 2013-10-20
    • 2019-10-09
    相关资源
    最近更新 更多