3 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個贊
但是,這種檢測似乎為時過早。
為了強(qiáng)調(diào)(@trashgod已經(jīng)在評論中提到了它):是的,這是預(yù)期的,也是Swing中一個相當(dāng)普遍的問題:-)
該表-以及具有任何模型的任何其他視圖,不僅是數(shù)據(jù),還包括選擇,調(diào)整...-正在監(jiān)聽模型以進(jìn)行自我更新。因此,自定義偵聽器只是該行中的另一個偵聽器(未定義服務(wù)順序)。如果要執(zhí)行依賴于視圖狀態(tài)的操作,則必須確保在所有內(nèi)部更新準(zhǔn)備就緒后執(zhí)行此操作(在此具體上下文中,內(nèi)部更新包括垂直scrollBar的adjustmentModel的更新)推遲自定義處理通過包裝SwingUtilities.invokeLater直到完成內(nèi)部操作為止:
TableModelListener l = new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.INSERT) {
invokeScroll();
}
}
protected void invokeScroll() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
int last = table.getModel().getRowCount() - 1;
Rectangle r = table.getCellRect(last, 0, true);
table.scrollRectToVisible(r);
}
});
}
};
table.getModel().addTableModelListener(l);

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個贊
我認(rèn)為這可能有助于我理解@trashgod所說的話我沒得到的東西。他提到invokeLater像您一樣將滾動調(diào)用包裝在一個包裝中,我認(rèn)為這將無法完成任何事情,因?yàn)槲业恼麄€程序已經(jīng)在這種包裝中。我現(xiàn)在注意到包裝器創(chuàng)建了一個new Runnable,我猜這是實(shí)現(xiàn)他所談?wù)摰摹芭判颉钡囊兀瑥亩WC了這個新的runnable不會在另一個runnable中的下一行完成之前運(yùn)行。完全正確嗎?
添加回答
舉報