6

ColorPicker を使用してセル内の色を (表示/編集) する TableView があります。テーブルの目的のフィールドに ColorPicker が表示されますが、編集が機能しません。

TableColumn<SeriesPreferences, Color> c2 = new TableColumn<SeriesPreferences, Color>("Color");
c2.setCellValueFactory(new PropertyValueFactory<SeriesPreferences, Color>("color"));
c2.setCellFactory(new Callback<TableColumn<SeriesPreferences, Color>,
                                TableCell<SeriesPreferences, Color>>()
    {
        @Override
        public TableCell<SeriesPreferences, Color> 
        call(final TableColumn<SeriesPreferences, Color> param)
        {
            TableCell<SeriesPreferences, Color> cell = 
                new TableCell<SeriesPreferences, Color>()
                    {
                        @Override
                        public void updateItem(Color c, boolean empty)
                        {
                            if(c != null)
                            {
                                final ColorPicker cp = new ColorPicker();
                                cp.setValue(c);
                                setGraphic(cp);
                                cp.setOnAction(new EventHandler<javafx.event.ActionEvent>()
                                    {
                                        public void 
                                        handle(javafx.event.ActionEvent t)
                                        {
                                            getTableView().edit(getTableRow().getIndex(), param);
                                            commitEdit(cp.getValue());
                                        }
                                    });
                            }
                        }
                    };
            return cell;
        }
    });

c2.setOnEditCommit(new EventHandler<CellEditEvent<SeriesPreferences, Color>>()
    {
        @Override
        public void handle(CellEditEvent<SeriesPreferences, Color> t)
        {
            ((SeriesPreferences) t.getTableView().getItems().get(t.getTablePosition().
                                                    getRow())).setColor(t.getNewValue());
        }
    });

カラー ピッカーで色を変更すると、編集イベント ハンドラーが呼び出されません。何かアイデアはありますか?

4

4 に答える 4

2

プロパティがテーブルに正しくバインドされている場合は、JavaFX POJO (または JavaFX Bean) に直接アクセスする必要はなく、commitEdit 以外を呼び出す必要もありません。

Max Beikirch からの回答は、テーブルが編集モードでないときにカラー ピッカー (およびそれに伴う色) が消えるため、誤解を招くものです。テーブルを編集モードにするのは回避策ですが、悪い方法です。ボタンをクリックしたときにカラー ピッカー ポップアップを表示する前に、次のようにします。

次のようにカラー ピッカーを使用してセルに書き込みます。

public class ColorTableCell<T> extends TableCell<T, Color> {    
    private final ColorPicker colorPicker;

    public ColorTableCell(TableColumn<T, Color> column) {
        this.colorPicker = new ColorPicker();
        this.colorPicker.editableProperty().bind(column.editableProperty());
        this.colorPicker.disableProperty().bind(column.editableProperty().not());
        this.colorPicker.setOnShowing(event -> {
            final TableView<T> tableView = getTableView();
            tableView.getSelectionModel().select(getTableRow().getIndex());
            tableView.edit(tableView.getSelectionModel().getSelectedIndex(), column);       
        });
        this.colorPicker.valueProperty().addListener((observable, oldValue, newValue) -> {
            if(isEditing()) {
                commitEdit(newValue);
            }
        });     
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    }

    @Override
    protected void updateItem(Color item, boolean empty) {
        super.updateItem(item, empty);  

        setText(null);  
        if(empty) {     
            setGraphic(null);
        } else {        
            this.colorPicker.setValue(item);
            this.setGraphic(this.colorPicker);
        } 
    }
}

Java 7 を使用している場合は、ラムダを匿名の内部クラスに置き換えますが、同様に機能するはずです。完全なブログ投稿はこちらです。

于 2014-10-27T11:20:25.900 に答える
1

さて、私は同じ問題を抱えていたので、そのトピックを少し調査しました。残念ながら JavaFX は使えません。

他のセルがどのように実装されているかを調べましたが、重要なのは、すべて文字列で表現できるものを使用していたことです。今では、Java の場合は常にそうです。Java のやり方で行うか、雨の中で放っておかれますか。JavaFX のドキュメントは現時点では非常に悪いので、うまくいくまで試してみる必要がありました。

つまり: イベントをトリガーするにeditCommitは、 を呼び出す必要がありsetContentDisplay(ContentDisplay. TEXT_ONLY)ますupdateItem()。データを文字列として表示したい場合はうまく機能しますが、カラーピッカーが仕事をするだけのこのような場合には完全に失敗します。

または、手動でイベントを発生させることもできます。しかし、どのようにテーブルの位置を取得しますか? 知らない。

于 2013-07-08T13:09:05.560 に答える
1

CheckBoxTableCell と DatePickerTableCell と ColorPickerTableCells にも同じ問題がありました:-(

私はそれを次のように扱います: コントロールのイベントで、" ((Inputs)getTableView().getItems().get(getTableRow().getIndex() "で使用中の POJO オブジェクトを取得し、同様に更新しますOnEditCommit メソッドで行われますか...

したがって、私にとっては次のようになります(色を更新します):

 ((Inputs) getTableView().getItems().get(
                    getTableRow().getIndex())
                    ).setColor(cp.getValue());

これは ColorPickerCell の例です:

public class ColorPickerTableCell<Inputs> extends TableCell<Inputs, Color>{
private ColorPicker cp;

public ColorPickerTableCell(){        
    cp = new ColorPicker(); 
    cp.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            commitEdit(cp.getValue());
            updateItem(cp.getValue(), isEmpty());
            ((Inputs) getTableView().getItems().get(
                    getTableRow().getIndex())
                    ).setColor(cp.getValue());
        }            
    });                
    setGraphic(cp);
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    setEditable(true);        
}     
@Override
protected void updateItem(Color item, boolean empty) {
    super.updateItem(item, empty);
    cp.setVisible(!empty);
    this.setItem(item);
    cp.setValue(item);
}
}

この単純な JavaFX の POJO を使用すると、次のようになります。

    public ObjectProperty<Color> color = new SimpleObjectProperty<Color>();

    this.color = new SimpleObjectProperty(color);

    public ObjectProperty<Color> colorProperty() {
    return color;
 }

public void setColor(Color color2) {
    color.set(color2);
}

それを実現する良い方法かどうかはわかりませんが、うまくいきました... JavaFX の POJO は、「ActionEvent」リクエスト (コンボボックス、日付ピッカー、カラーピッカーなど) 内でのみアクセスできることに注意してください。

よろしく、

于 2014-04-10T17:58:44.713 に答える
0

OPのコメントでMichael Simonsが言ったように。編集モードにする必要があります。startEdit();独自のカスタム セルを作成する場合、TableCell 内から呼び出して編集モードを手動でトリガーできます。

たとえば、コントロールの focusProperty を使用します。

    cp.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue) {
            startEdit();
        }
    });
于 2014-12-08T17:23:03.027 に答える