第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JTable模型偵聽器過早檢測到插入的行(在繪制之前)

JTable模型偵聽器過早檢測到插入的行(在繪制之前)

慕容3067478 2019-11-03 04:04:23
我有一個JTable可以由用戶動態(tài)添加的行。它位于中JScrollPane,因此當(dāng)行數(shù)足夠大時,滾動器變?yōu)榛顒訝顟B(tài)。我的愿望是,當(dāng)用戶添加新行時,滾動條將一直移動到底部,以便新行在滾動窗格中可見。我目前(下面的SSCCE)試圖使用表模型偵聽器來檢測何時插入行,并在進(jìn)行檢測時將滾動條一直向下推。但是,由于模型已更新,但實(shí)際上尚未繪制新行,因此這種檢測似乎“還為時過早”,因此發(fā)生的情況是,在插入新行之前,滾動條一直一直移動到底部,并且然后將新行插入到窗格末尾的下方(不可見)。顯然,這種方法在某種程度上是錯誤的。正確的方法是什么?import java.awt.Dimension;import java.awt.EventQueue;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.BoxLayout;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JScrollBar;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.JTable;import javax.swing.event.TableModelEvent;import javax.swing.event.TableModelListener;import javax.swing.table.DefaultTableModel;public class TableListenerTest {    private JFrame frame;    private JScrollPane scrollPane;    private JTable table;    private DefaultTableModel tableModel;    public static void main(String[] args) {        EventQueue.invokeLater(new Runnable() {            public void run() {                try {                    TableListenerTest window = new TableListenerTest();                    window.frame.setVisible(true);                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }    public TableListenerTest() {        initialize();    }    private void initialize() {        frame = new JFrame();        frame.setBounds(100, 100, 450, 200);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));        JSplitPane splitPane = new JSplitPane();        frame.getContentPane().add(splitPane);        scrollPane = new JScrollPane();        scrollPane.setPreferredSize(new Dimension(100, 2));        splitPane.setLeftComponent(scrollPane);
查看完整描述

3 回答

?
寶慕林4294392

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);



查看完整回答
反對 回復(fù) 2019-11-04
?
30秒到達(dá)戰(zhàn)場

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)行。完全正確嗎?

查看完整回答
反對 回復(fù) 2019-11-04
  • 3 回答
  • 0 關(guān)注
  • 361 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號