2017-02-16 3 views
0

私はいくつかのアドレスをプレビューとしてリストするTableViewを持っています。選択したアドレスは、TableViewの横の形式で編集できます。ユーザーが選択したアドレスを変更してTableViewで選択したアドレスを変更した場合、変更を保存せずに処理を進めるかどうかを尋ねます。いいえ、私は現在選択されている位置にとどまるTableviewをしたい場合、ユーザーが変更を破棄したい場合、TableViewは選択の変更を実行することがあります。JavaFX:カスタムTableViewSelectionModel

私のアプローチは、TableViewのSelectionModelを拡張し、ユーザーが説明されたダイアログに答えた場合や変更がない場合にのみ、選択を変更できるようにすることでした。基本的には、Tableviewで選択を変更する前にif節を追加するだけです。残念ながら、私は抽象クラス "TableViewSelectionModel"とそれの具体的な実装は見つかりませんでした。

クラス全体を実装せずに、この望ましい動作を得る方法はありますか?

+0

を公開APIには具体的な実装はありません。最善の策は、 'TableSelectionModel'をサブクラス化するラッパークラスを定義することです。テーブルビューから取得した選択モデルのデフォルトインスタンスを渡し、選択を変更する場合はメソッド呼び出しを委譲します。書く方法はかなりたくさんありますが、あなたがこのように実装すれば、それぞれのことはかなり簡単になります。 –

答えて

0

はJames_Dの勧告でそれを解決:

public class ControllableTableSelectionModel<T> extends TableViewSelectionModel<T>{ 

private TableViewSelectionModel<T> originalModel; 
private ControlsTableView controller; 

public ControllableTableSelectionModel(TableViewSelectionModel<T> originalModel, ControlsTableView controller) { 
    super(originalModel.getTableView()); 
    this.originalModel=originalModel; 
    this.controller=controller; 
} 

@Override 
public boolean isSelected(int row, TableColumnBase<T, ?> column) { 
    return originalModel.isSelected(row, column); 
} 

@Override 
public void selectLeftCell() { 
    if(controller.canSelect(this)) 
    { 
     originalModel.selectLeftCell(); 
    } 
} 

@Override 
public void selectRightCell() { 
    if(controller.canSelect(this)) 
    { 
     originalModel.selectRightCell(); 
    } 
} 

@Override 
public void selectAboveCell() { 
    if(controller.canSelect(this)) 
    { 
     originalModel.selectAboveCell(); 
    } 

} 

@Override 
public void selectBelowCell() { 
    if(controller.canSelect(this)) 
    { 
     originalModel.selectBelowCell(); 
    } 

} 

@Override 
public void selectRange(int minRow, TableColumnBase<T, ?> minColumn, int maxRow, 
     TableColumnBase<T, ?> maxColumn) { 
    if(controller.canSelect(this)) 
    { 
     originalModel.selectRange(minRow, minColumn, maxRow, maxColumn); 
    } 

} 

@Override 
protected int getItemCount() { 
    return originalModel.getTableView().getItems().size(); 
} 

@Override 
protected T getModelItem(int index) { 
    return originalModel.getTableView().getItems().get(index); 
} 

@Override 
public void focus(int index) { 
    originalModel.getTableView().getFocusModel().focus(index);  
} 

@Override 
public int getFocusedIndex() { 
    return originalModel.getTableView().getFocusModel().getFocusedIndex(); 
} 

@Override 
public ObservableList<TablePosition> getSelectedCells() { 
    return originalModel.getSelectedCells(); 
} 

@Override 
public boolean isSelected(int row, TableColumn<T, ?> column) { 
    return originalModel.isSelected(row, column); 
} 

@Override 
public void select(int row, TableColumn<T, ?> column) { 
    if(controller.canSelect(this)) 
    { 
     originalModel.select(row, column); 
    }  
} 

@Override 
public void clearAndSelect(int row, TableColumn<T, ?> column) { 
    if(controller.canSelect(this)) 
    { 
     originalModel.clearAndSelect(row, column); 
    }  
} 

@Override 
public void clearSelection(int row, TableColumn<T, ?> column) { 
    if(controller.canSelect(this)) 
    { 
     originalModel.clearSelection(row, column); 
    } 
} 

}

関連する問題