2017-01-26 7 views
0

私は次の問題があります。JavaFXを使用して自分のアプリケーションを書きます。私はTableViewを使用します。ユーザーは、データの監視、追加、削除に使用する必要があります。ユニークでなければならないIDフィールドがあります。だから、ユーザーがそれを編集し終えると、私は結果が一意かどうかをチェックする必要があります。それがユニークなら、私は変化を却下しなければなりません。または、データが更新され、必要であれば更新をスキップする瞬間にそれを確認する必要があります。JavaFX TableView。そのユーザー入力uniqe値を確認する方法

私は、このための通常の練習は何の3つの列

colID.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -> cell.getValue().getSID()); 
    colCaption.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -> cell.getValue().getSCaption()); 
    colType.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -> cell.getValue().getSType()); 

    colID.setCellFactory(TextFieldTableCell.forTableColumn()); 
    colCaption.setCellFactory(TextFieldTableCell.forTableColumn()); 
    colType.setCellFactory(TextFieldTableCell.forTableColumn()); 

    lstObservable = FXCollections.observableList(lstData, (CDataType param)->{ 

     param.getSID().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> { 

       System.out.println("getSID().ChangeListener: Changed: " + observable + ")"+ observable.getClass() + ") [" + oldValue + " -> " + newValue + "]"); 
      } 
     }); 

     return new Observable[]{param.getSID(), 
           param.getSCaption(), 
           param.getSType() 
     }; 
    }); 

    tabView.setItems(lstObservable); 

とテーブルビューを持っていますか?私はこの問題は新しいことではないと確信していますが、私は解決策を見つけることができません。

UPD:ユーザーの変更を軽減するためにどのようなイベントを処理する必要があるのか​​分かりません。私はChangeListenerでなければならないと思いますが、データ項目の値を元に戻すと、無限再帰が得られます。

+1

もが、最も簡単なアプローチは、そのセットがあることが含まれている場合、セット内のすべてのIDを収集し、新しい値を挿入チェックイン時にすることですid。かなり高速に動作する数百万のレコードを持っていない場合は、 – Enigo

+0

問題は私がどこでそれをチェックすべきかわからないということですか? ChangeListenerの場合、どのように変更を避けることができますか? – Yura

答えて

1

あなたがコミット編集でこれを扱うことができる - 次のようなもの:

colID.setOnEditCommit(event -> { 
    String newValue = event.getNewValue(); 
    if(checkUniqueness(newValue)){ 
     event.getRowValue().setSID(newValue); 
    }else { 
     event.getRowValue().setSID(null); 
    } 

    //Weird FX Bug - on the second time through, the value was set, but the table 
    //column didn't repaint, showing the incorrect amount. 
    colID.setVisible(false); 
    colID.setVisible(true); 
}); 

//Stream the backing collection for the table and look for the value that needs to be unique 

public boolean checkUniqueness(String value) { 
     return backingCollection 
      .stream() 
      .noneMatch(item -> item.getSID().equals(value)); 
    } 
+0

ありがとう!このトリックはsetVisibleで本当に助けられました。私は列の可視性を除いて全く同じことをしました。もう一度ありがとう! – Yura

+0

は、setVisibleが私をコーディングに多くの不満を抱かせる原因の1つでした。最終的には、再表示するまで表示された値の変更を停止するので、これが一貫した動作を提供する唯一の方法です。 –

+0

あなたは私の多くのイライラした日々を救った:) – Yura

関連する問題