0

私はいくつかの問題に行き詰まっています。ガイダンスが必要です! 私は2つのComboBoxTableCellsを持つTableViewを持っています.私の要件は、最初のセルの変更時に2番目のセルのコンボボックスのリストを更新することです.

私は次の方法で試しましたが、これまでのところ運がありません。

 public class Test{
    private StringProperty name;
    private StringProperty city;

    public Test(String name, String city){
        this.name = new SimpleStringProperty(name);
        this.city = new SimpleStringProperty(city);
    }

    public String getName() {
        return name.get();
    }

    public void setName(String name) {
        this.name.setValue(name); 
    }

    public String getCity() {
        return city.get();
    }

    public void setCity(String city) {
        this.city.setValue(city);
    }

    public StringProperty nameProperty() {return name;}
    public StringProperty cityProperty() {return city;}
}


    TableView _table= new TableView();
    final ObservableList list = FXCollections.observableArrayList();
    list.add("name 1");
    list.add("name 2");
    list.add("name 3");
    list.add("name 4");

    final ObservableList list2 = FXCollections.observableArrayList();
    list2.add("city 1");
    list2.add("city 2");
    list2.add("city 3");
    list2.add("city 4");

    TableColumn firstNameCol = new TableColumn("First Name");
    firstNameCol.setMinWidth(100);
    firstNameCol.setCellValueFactory(new PropertyValueFactory<Test, String>("name"));
    firstNameCol.setCellFactory(ComboBoxTableCell.forTableColumn(list));

    firstNameCol.setOnEditCommit(
        new EventHandler<CellEditEvent<Test, String>>() {
            @Override
            public void handle(CellEditEvent<Test, String> t) {
     ((Test) t.getTableView().getItems().get(t.getTablePosition().getRow())).setName(t.getNewValue());

                System.out.println(t.getTableColumn().getCellData(t.getTablePosition().getRow()));

ここで何かをしなければならないと思います。次の行を試して、それぞれのセルへの影響を確認してください
list2.clear();
列全体のデータを更新しました。それぞれのセルのみを更新したいだけです。

            }
        }
    );


    TableColumn lastNameCol = new TableColumn("City");
    lastNameCol.setMinWidth(100);
    lastNameCol.setCellValueFactory(
        new PropertyValueFactory<Test, String>("city"));
    lastNameCol.setCellFactory(ComboBoxTableCell.forTableColumn(list2));
    lastNameCol.setOnEditCommit(
        new EventHandler<CellEditEvent<Test, String>>() {
            @Override
            public void handle(CellEditEvent<Test, String> t) {
                ((Test) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())
                        ).setName(t.getNewValue());
            }
        }
    );

    _table.setEditable(true);
    _table.getColumns().addAll(firstNameCol,lastNameCol);

    ObservableList listItems = FXCollections.observableArrayList();
    listItems.add(new Test("name 4", "city 2"));
    listItems.add(new Test("name 2", "city 3"));
    table.getTableView().setItems(listItems);
    _table.setItems(listItems); 

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

1

私がテストしていないハッキーなアプローチは次のとおりです。

  1. firstNameCol と lastNameCol の間の通信に使用するデータ項目にダミー (ブール値?)プロパティを追加します。
  2. firstNameCol の onEditCommit ハンドラで、ダミー プロパティの値を変更します。必ず変更してください。
  3. lastNameCol をダミー プロパティの列にします。オーバーライドされた updateItem() メソッドで TableCell を返す lastNameCol のセル ファクトリを登録します (以下の疑似コード)。

    lastNameCol.setCellFactory(new Callback() {
        @Override
        public TableCell call(TableColumn col) {
            return new TableCell() {
                @Override
                public void updateItem(Boolean item, boolean empty) {
                    if (!empty) {
                        // Don't care about the value of item
                        // Just look up the value of firstNameCol using
                        // getTablePosition(), then create and populate
                        // a ComboBox with the appropriate items and set
                        // it as the graphic for this cell via this.setGraphic()
                        // Add handler to ComboBox control to update data item when
                        // selection changes
                    }                                                
                }
            };
        }
    });
    
于 2013-07-22T18:58:16.563 に答える