0

テーブル ビューがあり、その中に TextField で満たされた列が 1 つあります。

データが少なく、テーブルにスクロール バーがない場合は問題ありません。すべての TextField が表示されます。

問題は、テーブルを下にスクロールしてから再び上に移動すると、一部の TextField が欠落していることです。

TextField で満たされた列のコードは次のとおりです。

purchaseQtyCol.setCellFactory(
                new Callback<TableColumn< TransactionModel, TextField>, TableCell< TransactionModel, TextField>>() {
                    @Override
                    public TableCell< TransactionModel, TextField> call(final TableColumn< TransactionModel, TextField> p) {
                        TableCell<TransactionModel, TextField> cell = new TableCell<TransactionModel, TextField>() {


                            @Override
                            public void updateItem(TextField item, boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    /**
                                     * for(CheckBox cbb : canceledCB) {
                                     * if(item.equals(cbb))
                                     * System.out.println("aa" +
                                     * this.indexProperty().getValue() + " " +
                                     * item.isSelected() ); }*
                                     */
                                    this.setGraphic(item);
                                }

                            }

                        };

                        cell.setAlignment(Pos.CENTER);
                        return cell;
                    }
                });

        purchaseQtyCol.setCellValueFactory(new Callback<CellDataFeatures<TransactionModel, TextField>, ObservableValue<TextField>>() {
            @Override
            public ObservableValue<TextField> call(final CellDataFeatures<TransactionModel, TextField> p) {

                    System.out.println("new textfield");
                    final TextField qtyField = new TextField() {
                        @Override
                        public void replaceText(int start, int end, String text) {

                            if (text.matches("[0-9]") || text.equals("")) {
                                super.replaceText(start, end, text);
                                if (this.getText().isEmpty()) {
                                    p.getValue().setPurchaseQty(0);
                                    p.getValue().setTotalPrice(0);
                                } else {
                                    p.getValue().setPurchaseQty(Integer.parseInt(this.getText()));
                                    p.getValue().setTotalPrice(p.getValue().purchaseQtyProperty().intValue() * p.getValue().basePriceProperty().intValue());
                                }
                                recountTotals();
                            }
                        }

                        @Override
                        public void replaceSelection(String text) {

                            if (text.matches("[0-9]") || text.equals("")) {
                                super.replaceSelection(text);
                                if (this.getText().isEmpty()) {
                                    p.getValue().setPurchaseQty(0);
                                    p.getValue().setTotalPrice(0);
                                } else {
                                    p.getValue().setPurchaseQty(Integer.parseInt(this.getText()));
                                    p.getValue().setTotalPrice(p.getValue().purchaseQtyProperty().intValue() * p.getValue().basePriceProperty().intValue());
                                }
                                recountTotals();
                            }
                        }
                    };

                    qtyField.setText("" + p.getValue().purchaseQtyProperty().getValue());
                    qtyField.setAlignment(Pos.CENTER_RIGHT);

                return new SimpleObjectProperty(qtyField);
            }
        });

皆さんからの助けに本当に感謝しています。

よろしく、

クリスマ・アンディカ

4

3 に答える 3

1

クリスマ!あなたが直面している問題は、テーブルビューのアイテムの更新に関する JavaFX の有名な問題です。これについては、たとえばhereなどの回避策が既にあります。解決策は、テーブルビューの内部更新メカニズムをトリガーすることでした

tableview.getColumns().get(0).setVisible(false);
tableview.getColumns().get(0).setVisible(true);

しかし、私が理解できる限り、このソリューションはデータの変更のみに影響し、テーブルビューのノードのスタイルには影響しませんでした。

私も使った

@Override
public void updateItem(Object item, boolean empty)

私の実装では十分ではありませんでしたが、テーブルに行が多すぎてスクロールバーが表示されると、行の更新が完全に混乱したため、十分ではありませんでした。

私が必要としていたのは、css を使用して、いくつかの基準を満たすすべての可視行を強調表示することです。私は次の方法でそれを達成しました:

Callback<TableView<Person>, TableRow<Person>> callBack = 
    new Callback<TableView<Person>, TableRow<Person>>() {
        @Override
        public TableRow<Person> call(TableView<Person> tableView) {
              final TableRow<Person> row = new TableRow<Person>() {
                     @Override
                     public void updateItem(Person item, boolean empty) {
                          super.updateItem(item, empty);
                          if(!empty && item.getFirstName() == "John") {
                              getStyleClass().add("john");
                          }
                     }
               };
               row.visibleProperty().addListener(new ChangeListener() {
                     @Override
                     public void changed(ObservableValue observableValue, Object t, Object t1) {
                         Boolean oldValue = (Boolean)t;
                         Boolean newValue = (Boolean)t1;
                         if(oldValue && !newValue) {
                             row.getStyleClass().remove("john");
                         }
                         if(!oldValue && newValue) {
                             if(row.getItem().getFirstName() == "John")
                                 row.getStyleClass().add("john");
                         }
                     }
               });
               return row;
        }
};
tableview.setRowFactory(callBack);

css ファイルには、次の行が含まれている必要があります。

.john {
-fx-background-color: forestgreen;
-fx-text-fill: white;
-fx-border-style: solid;
}

もちろん、行の異なるスタイルを選択することもできます。

Person クラスには以下が含まれている必要があります

public SimpleStringProperty firstNameProperty() {
    return firstName;
}

ご覧のとおりVisibleProperty、各行の css 動作を制御する行にリスナーを追加しました。おそらく、このアイデアは、行のスタイリングだけでなく、場合によってはテーブルビューでのデータ更新を解決するのに役立つ可能性があります。

プログラムの結果には影響しませんが、上記のコードNullPointerExceptionのメソッドでを受け取り始めたことも付け加えておきます。public void changed

クリスマ、お役に立てば幸いです!そして他の人も!

于 2012-12-05T06:06:48.123 に答える
0

チェックボックスに問題がありました。大きなテーブルをすばやくスクロールすると、ランダムに消えてしまいました。cellFactory で次の行を削除するだけで解決しました。

   @Override
    public void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
       if (empty) {
           setText(null);
           // setGraphic(null); (This line causes weird behaviour in scrolling, delete it)
        } else {
            checkBox.setSelected(item);
        }
    }
于 2013-08-02T14:32:49.913 に答える