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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

蕪湖不蕪 2019-10-12 13:56:47
我有一個(gè)JTable可以由用戶動(dòng)態(tài)添加的行。它位于中JScrollPane,因此當(dāng)行數(shù)足夠大時(shí),滾動(dòng)器變?yōu)榛顒?dòng)狀態(tài)。我的愿望是,當(dāng)用戶添加新行時(shí),滾動(dòng)條將一直移動(dòng)到底部,以便新行在滾動(dòng)窗格中可見。我目前(下面的SSCCE)試圖使用表模型偵聽器來(lái)檢測(cè)何時(shí)插入行,并在進(jìn)行檢測(cè)時(shí)將滾動(dòng)條一直向下推。但是,由于模型已更新,但實(shí)際上尚未繪制新行,因此這種檢測(cè)似乎“還為時(shí)過(guò)早”,因此發(fā)生的情況是,在插入新行之前,滾動(dòng)條一直一直移動(dòng)到底部,并且然后將新行插入到窗格末尾的下方(不可見)。顯然,這種方法在某種程度上是錯(cuò)誤的。正確的方法是什么?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 回答

?
桃花長(zhǎng)相依

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊

但是,這種檢測(cè)似乎為時(shí)過(guò)早。


為了強(qiáng)調(diào)(@trashgod已經(jīng)在評(píng)論中提到了它):是的,這是預(yù)期的,也是Swing中一個(gè)相當(dāng)普遍的問題:-)


該表-以及具有任何模型的任何其他視圖,不僅是數(shù)據(jù),還包括選擇,調(diào)整...-正在監(jiān)聽模型以進(jìn)行自我更新。因此,自定義偵聽器只是該行中的另一個(gè)偵聽器(未定義服務(wù)順序)。如果要執(zhí)行依賴于視圖狀態(tài)的操作,則必須確保在所有內(nèi)部更新準(zhǔn)備就緒后執(zhí)行此操作(在此具體上下文中,內(nèi)部更新包括垂直scrollBar的adjustmentModel的更新)推遲自定義處理通過(guò)包裝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);


查看完整回答
反對(duì) 回復(fù) 2019-10-12
?
喵喵時(shí)光機(jī)

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊

我認(rèn)為這可能有助于我理解@trashgod所說(shuō)的話我沒得到的東西。他提到invokeLater像您一樣將滾動(dòng)調(diào)用包裝在一個(gè)包裝中,我認(rèn)為這將無(wú)法完成任何事情,因?yàn)槲业恼麄€(gè)程序已經(jīng)在這種包裝中。我現(xiàn)在注意到包裝器創(chuàng)建了一個(gè)new Runnable,我猜這是實(shí)現(xiàn)他所談?wù)摰摹芭判颉钡囊?,從而保證了這個(gè)新的runnable不會(huì)在另一個(gè)runnable中的下一行完成之前運(yùn)行。完全正確嗎?

查看完整回答
反對(duì) 回復(fù) 2019-10-12
  • 3 回答
  • 0 關(guān)注
  • 407 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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