我有一個窗口,它在表格中顯示日誌事件。 例如,用戶正在讀取某一行表中的文本。當新的日誌到來時,它們被添加到表格的開頭,並且用戶正在閱讀的行向下移動。我有一個要求,當在表的開頭添加新行時,防止JScrollPane滾動。我嘗試了不同的東西,但沒有任何幫助。有人可以告訴我如何實現這個? 在此先感謝!如何使JScrollPane在表格的開頭添加行後不滾動
1
A
回答
1
棘手的任務:-)移動出現是因爲默認情況下,滾動位置是而不是以任何方式調整:添加上面的行只是保持垂直滾動位置,然後指向一個不同的行像以前一樣。
只需要什麼:
的的visibleRect /最後一行 的- 跟蹤前插入
- 聽型號的變化插入
- 計算新的可見矩形等老最後一行滾動回視圖
- 觸發滾動
這很棘手,因爲我們需要聽取模型更改。該監聽器是由表格內部註冊的modelListener的鄰居,該表格根據更改進行更新。所以我們需要確保後的內部變更完成並同時使用之前的信息的內部更新。
一個骯髒的解決方案 - 取決於搖擺聽衆通知通常的順序是最後加入先通知(注意:DONT在生產代碼它會容易折斷,網絡改變了LAF時) - 是通知當收集前狀態並調整包裹在一個invokeLater的滾動位置:
final DefaultTableModel model = new DefaultTableModel(20, 2);
for (int i = 0; i < model.getRowCount(); i++) {
model.setValueAt(i, i, 0);
}
final JTable table = new JTable(model);
Action action = new AbstractAction("add row at 0") {
@Override
public void actionPerformed(ActionEvent e) {
model.insertRow(0, new Object[] {});
}
};
JXFrame frame = wrapWithScrollingInFrame(table, "modify scroll");
TableModelListener l = new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
if (!TableUtilities.isInsert(e)) return;
final Rectangle r = table.getVisibleRect();
final int lastRow = table.rowAtPoint(
new Point(0, r.y + r.height - 5));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// assuming
// a) the insert was exactly 1 row
// b) was _before_ the old last row in view-coordinates
Rectangle cell = table.getCellRect(lastRow + 1, 0, true);
cell.translate(0, -r.height + cell.height);
cell.height = r.height;
table.scrollRectToVisible(cell);
}
});
}
};
model.addTableModelListener(l);
得到的適當的方式之前,狀態乾淨取決於您的具體情境。您可以將表格的生命週期內跟蹤第一/最後一排的,在(一個或全部)
- 一個ListSelectionListener該行selectionModel設置更新它們(如果用戶閱讀該行始終被選中)
- 一個ChangeListener垂直滾動條
- 一個的ComponentListener到滾動窗格的大小改變
相關問題
- 1. JScrollPane滾動在最後添加的行
- 2. 在運行時添加組件後如何使JScrollPane可滾動
- 3. JScrollPane在添加JPanel時不滾動
- 4. 如何使用javascript將行添加到表格的開頭
- 5. JScrollPane不會將滾動條添加到動態增長表中
- 6. 添加向下滾動的表格行
- 7. JScrollPane不滾動
- 8. jQuery的數據表和JScrollPane中 - 表頭不滾動
- 9. JScrollPane使用箭頭鍵滾動
- 10. JScrollPane的使用滾動箭頭,但沒有滾動條
- 11. 如何在每行的開頭和結尾添加空格
- 12. 如何加快表格行滾動?
- 13. Reportrlab - 如何在每個頁面的開頭添加表格
- 14. 如何使用html和Javascript在表格中添加滾動條?
- 15. JScrollPane在JTextArea中不滾動
- 16. 啓動JScrollPane後設置元素 - JScrollPane不會滾動
- 17. 如何修復表頭和滾動錶行於下表格式
- 18. JTable單元格:JScrollPane不滾動
- 19. 如何在新行的開頭添加自動文本?
- 20. 如何添加在每行的開頭添加文本?
- 21. 添加箭頭滾動條
- 22. 如何水平/垂直滾動條添加到JScrollPane中
- 23. 如何使用JScrollPane連續滾動
- 24. 如何添加一些HTML到表單元格(td)的開頭?
- 25. SQL Server 2005:如何將一列添加到表格的開頭?
- 26. 如何在表中添加滾動條
- 27. 滾動表格時,加載欄不在表格行內
- 28. 添加到行的開頭
- 29. 我如何動態添加表格行
- 30. jScrollPane - 如何讓滾動條單獨的箭頭
感謝您的repsonse!我幫助了! – obogoliy