JavaFX TableView-无法编辑 [英] JavaFX TableView - can not be edited

查看:99
本文介绍了JavaFX TableView-无法编辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在TableView上使用编辑. 我用这个tut作为参考: http://docs.oracle.com/javafx/2/ui_controls /table-view.htm# 但是我正在使用FXML文件进行创建(使用JavaFX Scene Builder). 我已经检查了表和列的可编辑复选框(在Scene Builder中),但是如果执行该程序,则无法编辑值.我已经从tut下载了示例项目,并且在那里可以进行编辑...因此,在我的项目中,TextField没有打开:( 控制器:

I am trying to use the edit on a TableView. i used this tut as reference: http://docs.oracle.com/javafx/2/ui_controls/table-view.htm# but I am using a FXML file for the creation (with the JavaFX Scene Builder). I have checked the editable checkboxes for the table and the columns (in the Scene Builder), but if I execute the program, I am not able to edit the values. I have downloaded the example project from the tut and the editing works there... so, in my project the TextField doesn´t get opened :( The controller:

public class StatesPopupController implements Controllerable, Initializable {
    // <editor-fold desc="fxml import stuff" defaultstate="collapsed">
    @FXML //  fx:id="guiStatesTable"
    private TableView<StateData> guiStatesTable; // Value injected by FXMLLoader
    @FXML //  fx:id="guiColorColumn"
    private TableColumn<StateData, String> guiColorColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiFontEffectColumn"
    private TableColumn<StateData, String> guiFontEffectColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiUseColumn"
    private TableColumn<StateData, String> guiUseColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiValueColumn"
    private TableColumn<StateData, String> guiValueColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddColor"
    private TextField guiStateAddColor; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddFontEffect"
    private TextField guiStateAddFontEffect; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddUse"
    private TextField guiStateAddUse; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddValue"
    private TextField guiStateAddValue; // Value injected by FXMLLoader
// </editor-fold>

    private Modelable model = null;

    public StatesPopupController() {
        this.model = new StatesPopupModel();
    }

    @Override
    public Modelable getModel() {
        return model;
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        this.guiStatesTable.setEditable(true);
        this.guiValueColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("value"));
        this.guiColorColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("color"));
        this.guiUseColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("use"));
        this.guiFontEffectColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("fontEffect"));
        this.guiStatesTable.setItems(((StatesPopupModel)this.model).getTableData());
    }

    public void newAddBtnEvent(ActionEvent event {
        ((StatesPopupModel)this.model).addDataEntry(guiStateAddValue.getText(), guiStateAddColor.getText(), guiStateAddUse.getText(), guiStateAddFontEffect.getText());
        guiStateAddValue.clear();
        guiStateAddColor.clear();
        guiStateAddUse.clear();
        guiStateAddFontEffect.clear();
        this.guiStatesTable.setItems(((StatesPopupModel) this.model).getTableData());
    }

    public void newEditValueEvent(CellEditEvent<StateData, String> event) {

        ((StateData)event.getTableView().getItems().get(event.getTablePosition().getRow())).setValue(event.getNewValue());
    }

    public void newEditColorEvent(ActionEvent event) {
        System.out.print("asd");
    }

    public void newEditUseEvent(ActionEvent event) {}

    public void newEditFontEffectEvent(ActionEvent event) {}
}

型号:

public class StatesPopupModel implements Modelable {
    private ObservableList<StateData> data = FXCollections.observableArrayList(
        new StateData("inactive", "9", "permit", "plain"),
        new StateData("active", "2", "permit", "plain"),
        new StateData("unavailable", "7", "inhibit", "plain"),
        new StateData("available", "2", "permit", "plain"),
        new StateData("invisible", "2", "inhibit", "plain"),
        new StateData("visible", "4", "permit", "plain"),
        new StateData("controlSign", "10", "inhibit", "plain"),
        new StateData("label", "5", "permit", "plain"));

    public void addDataEntry(String value, String color, String use, String fontEffect) {
        data.add(new StateData(value, color, use, fontEffect));
    }

    public ObservableList<StateData> getTableData() {
        return data;
    }
}

StateData类:

public class StateData
{
    private final SimpleStringProperty value;
    private final SimpleStringProperty color;
    private final SimpleStringProperty use;
    private final SimpleStringProperty fontEffect;

    public StateData(String value, String color, String use, String fontEffect) {
        this.value = new SimpleStringProperty(value);
        this.color = new SimpleStringProperty(color);
        this.use = new SimpleStringProperty(use);
        this.fontEffect = new SimpleStringProperty(fontEffect);
    }

    /**
     * @return the value
     */
    public String getValue() {
        return value.get();
    }

    /**
     * @param value the value to set
     */
    public void setValue(String value) {
        this.value.set(value);
    }

    /**
     * @return the color
     */
    public String getColor() {
        return color.get();
    }

    /**
     * @param color the color to set
     */
    public void setColor(String color) {
        this.color.set(color);
    }

    /**
     * @return the use
     */
    public String getUse() {
        return use.get();
    }

    /**
     * @param use the use to set
     */
    public void setUse(String use) {
        this.use.set(use);
    }

    /**
     * @return the fontEffect
     */
    public String getFontEffect() {
        return fontEffect.get();
    }

    /**
     * @param fontEffect the fontEffect to set
     */
    public void setFontEffect(String fontEffect) {
        this.fontEffect.set(fontEffect);
    }
}

这里是fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" minHeight="397.0" minWidth="264.0" prefHeight="397.0" prefWidth="427.0" xmlns:fx="http://javafx.com/fxml" fx:controller="controller.popup.StatesPopupController">
  <children>
    <Label text="States" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="6.0">
      <font>
        <Font name="System Bold" size="15.0" />
      </font>
    </Label>
    <TableView fx:id="guiStatesTable" editable="true" prefHeight="311.0" prefWidth="236.0" AnchorPane.bottomAnchor="52.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="34.0">
      <columns>
        <TableColumn prefWidth="75.0" text="Value" fx:id="guiValueColumn" />
        <TableColumn prefWidth="75.0" text="Color" fx:id="guiColorColumn" />
        <TableColumn prefWidth="75.0" text="Use" fx:id="guiUseColumn" />
        <TableColumn prefWidth="75.0" text="fontEffect" fx:id="guiFontEffectColumn" />
      </columns>
    </TableView>
    <HBox id="HBox" alignment="CENTER" prefWidth="236.0" spacing="5.0" AnchorPane.bottomAnchor="17.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0">
      <children>
        <TextField fx:id="guiStateAddValue" prefWidth="93.0" promptText="Value" />
        <TextField fx:id="guiStateAddColor" prefWidth="79.0" promptText="Color" />
        <TextField fx:id="guiStateAddUse" prefWidth="79.0" promptText="Use" />
        <TextField fx:id="guiStateAddFontEffect" prefWidth="79.0" promptText="Font Effect" />
        <Button mnemonicParsing="false" onAction="#newAddBtnEvent" text="Add" />
      </children>
    </HBox>
  </children>
</AnchorPane>

欢迎所有帮助.

如果我正在使用:

.setCellFactory(TextFieldTableCell.forTableColumn());

我收到此错误:

error: method setCellFactory in class TableColumn<S,T> cannot be applied to given types;
    guiUseColumn.setCellFactory(TextFieldTableCell.forTableColumn());
                ^
  required: Callback<TableColumn<StateData,String>,TableCell<StateData,String>>
  found: Callback<TableColumn<Object,String>,TableCell<Object,String>>
  reason: actual argument Callback<TableColumn<Object,String>,TableCell<Object,String>> cannot be converted to Callback<TableColumn<StateData,String>,TableCell<StateData,String>> by method invocation conversion
  where S,T are type-variables:
    S extends Object declared in class TableColumn
    T extends Object declared in class TableColumn

推荐答案

要使TableView可编辑,您还应该提供一个CellFactory来处理编辑控件的创建.

To make TableView editable you should also provide a CellFactory which will handle creation of the editing controls.

您可以在此处找到本教程的相应部分: http: //docs.oracle.com/javafx/2/ui_controls/table-view.htm#sthref119

You can find corresponding part of the tutorial here: http://docs.oracle.com/javafx/2/ui_controls/table-view.htm#sthref119

这篇关于JavaFX TableView-无法编辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆