1

で編集を使用しようとしていますTableView。私はこのツットを参照として使用しました: http://docs.oracle.com/javafx/2/ui_controls/table-view.htm# しかし、作成にはFXMLファイルを使用しています(JavaFX Scene Builderを使用)。(Scene Builder で) テーブルと列の編集可能なチェックボックスをオンにしましたが、プログラムを実行すると、値を編集できません。tut からサンプル プロジェクトをダウンロードし、そこで編集作業を行いました...そのため、私のプロジェクトではTextField開かれません :( コントローラ:

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
4

3 に答える 3

4

これを試して:

....setCellFactory(TextFieldTableCell.<StateData>forTableColumn());
于 2014-12-10T07:06:33.093 に答える
4

編集可能にするには、編集コントロールの作成を処理TableViewする も提供する必要があります。CellFactory

チュートリアルの対応する部分は、http: //docs.oracle.com/javafx/2/ui_controls/table-view.htm#sthref119にあります。

于 2012-10-15T17:27:50.513 に答える
2

同じ問題があり、FXML ビューとコントローラーを分離した適切なソリューションが見つかりませんでした。私もこのモデルにこだわりたいです。上記の例は私にはうまくいきませんでした。そこで、このチュートリアルを少し修正しました。

ソリューションにはカスタムが含まれていますTableCellFactory。以下を変更TableCellして追加する必要がありました。TextFieldTableCell

cell.setConverter(new StringConverter<T>() {
            @Override
            public String toString(T object) {
                return object.toString();
            }
            @Override
            public T fromString(String string) {
                return (T) string;
            }
        });

Controller には、変更を処理する新しいメソッドがあります。例えば

@FXML
protected void changeFirstName(CellEditEvent<Person, String> event) {
    ((Person) event.getTableView().getItems().get(event.getTablePosition().getRow())).setFirstName(event.getNewValue());
}

参照は FXML ファイルにあります

<TableColumn fx:id="firstNameColumn" text="First Name" prefWidth="100" onEditCommit="#changeFirstName">

私の完全な Maven の例で完全な変更を見つけることができます。

于 2016-04-26T19:00:05.800 に答える