ObservableList綾伙紝榪欎釜綾籛rap涓涓猨ava.util.List錛屽綋浣犲鍏惰繘琛屽鍒犳敼鏃訛紝涓庡叾緇戝畾鐨刄I緇勪歡浼氳嚜鍔ㄥ緱鍒板悓姝ャ備絾鏄疧bservableList 鐨勫疄鐜版湁涓緢澶х殑闂灝辨槸瀵瑰叾鐨勮闂彧闄愪簬鍏舵墍灞炵殑Realm錛岃繖涓猂ealm璇寸櫧浜嗗氨鏄疭WT鐨刄I綰跨▼錛岃屽綋鎴戜滑鍦⊿WT涓祵鍏WT鏃訛紝鍏朵腑鐨凙WT鐣岄潰鏄窇鍦ㄥ叾鑷韓鐨勭嚎紼嬮噷闈㈢殑銆傛墍浠ユ兂瑕佽JTable涓嶫Face Data Binding Framework(涓嬫枃涓畝縐癑DBF)涓璧峰崗鍚屽伐浣滆繕瑕佽В鍐沖綰跨▼鐨勯棶棰樸傚簾璇濅笉澶氳浜嗭紝鐩存帴涓婅彍錛?br />
public class DOTableModel extends AbstractTableModel { /**
* the ObservableList instance to be shared with
*/
private ObservableList list;
private volatile Integer rowCount = null;
private volatile DOModel object;;
private final Object lock = new Object();
private static final long serialVersionUID = -8377145381412656796L;
public DOTableModel(ObservableList list){
this.list = list;
this.list.addListChangeListener(new IListChangeListener(){
@Override
public void handleListChange(ListChangeEvent event) {
for(ListDiffEntry de : event.diff.getDifferences()){
if(de.isAddition()){
DOTableModel.this.fireTableRowsInserted(de.getPosition(), de.getPosition());
}else{
DOTableModel.this.fireTableRowsDeleted(de.getPosition(), de.getPosition());
}
}
}
});
}
@Override
public int getRowCount() {
list.getRealm().exec(new Runnable(){
@Override
public void run() {
rowCount = list.size();
synchronized (lock) {
lock.notify();
}
}
});
synchronized (lock) {
while(rowCount == null){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return rowCount;
}
@Override
public int getColumnCount() {
return 11;
}
private void getObjectFromSWTRealm(final int rowIndex){
object = null;
list.getRealm().exec(new Runnable(){
@Override
public synchronized void run() {
object = (DOModel) list.get(rowIndex);
synchronized (lock) {
lock.notify();
}
}
});
synchronized (lock) {
while(object == null){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
public Object getValueAt(final int rowIndex, int columnIndex) {
getObjectFromSWTRealm(rowIndex);
...
}
@Override
public void setValueAt(Object oValue, final int rowIndex, int columnIndex) {
getObjectFromSWTRealm(rowIndex);
...
}
@Override
public String getColumnName(int column) {
...
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
}