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

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

插入到 DefaultTableModel 中的行不顯示

插入到 DefaultTableModel 中的行不顯示

慕斯王 2023-10-13 14:39:03
在我的 Java 8 應(yīng)用程序中,我使用 aSwingWorker從數(shù)據(jù)庫獲取一些數(shù)據(jù),并publish在知道整行數(shù)據(jù)后調(diào)用,然后將其添加到表中:DefaultTableModel dtm123 = (DefaultTableModel) myTable.getModel();@Overrideprotected void process(List<Integer> chunks) {    if(chunks!=null) {        ListIterator<Integer> li = chunks.listIterator();        while(li.hasNext()) {            dtm123.addRow(myDataList.get(li.next()).getRowArray());        }                        }}dtm123.getRowCount()每次都會增加(我檢查過),但表并未更新以實際顯示新行。我嘗試手動更新它,但也不起作用:dtm123.fireTableRowsInserted(0, dtm123.getColumnCount()-1);這是奇怪的事情:如果我使用完整版本,它就可以很好地填充表格:((DefaultTableModel) myTable.getModel()).addRow(myDataList.get(li.next()).getRowArray());您不能使用較短的版本來填充表格嗎?dtm123沒有在其他地方使用,那么這兩個版本有什么區(qū)別?編輯:像這樣直接填充它(不帶SwingWorker)可以工作:myTable.setModel(new DefaultTableModel(    new Object[][] {},    new Object[] {"blaA","blaB","blaC"}));DefaultTableModel dtm123 = (DefaultTableModel) myTable.getModel();dtm123.addRow(new String[] {"bla1A","bla1B","bla1C"});dtm123.addRow(new String[] {"bla2A","bla2B","bla2C"});dtm123.addRow(new String[] {"bla3A","bla3B","bla3C"});dtm123.addRow(new String[] {"bla4A","bla4B","bla4C"});dtm123.addRow(new String[] {"bla5A","bla5B","bla5C"});dtm123.addRow(new String[] {"bla6A","bla6B","bla6C"});dtm123.addRow(new String[] {"bla7A","bla7B","bla7C"});看起來這SwingWoker就是問題所在,但為什么呢?process正在主線程上運行,必須用于 UI 更新,并且沒有異?;蝈e誤消息。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻1906條經(jīng)驗 獲得超3個贊

修復(fù)了它 - 有兩個原因?qū)е滤黄鹱饔茫?/p>

  1. 設(shè)置表的模型 ( myTable.setModel(new DefaultTableModel(...add info here...));) 和創(chuàng)建列也必須在主/UI 線程上完成。

  2. process在調(diào)用后看似隨機的時間點被調(diào)用publish(),并且無法事先知道將有多少塊(可能只是其中一個或全部),因此您必須確保在設(shè)置DefaultTableModel 獲得列。publish()為了保證這一點,要么在第一次調(diào)用之前設(shè)置列(但仍在外部doInBackground- 請參閱 1.),要么調(diào)用publish“第零次”時間來設(shè)置它們(請參閱下面的代碼)。事后看來,這似乎很明顯......

如果您像我一樣使用SwingWorker,您可以執(zhí)行以下操作:

DefaultTableModel dtm123;


@Override

protected void process(List<Integer> chunks) {

    if(chunks!=null) {

        ListIterator<Integer> li = chunks.listIterator();

        int next;


        while(li.hasNext()) {

            next = li.next();


            if(next==-1) {

                //Set up columns/column titles here

                myTable.setModel(new DefaultTableModel(

                    new Object[][] {},

                    columnHeaderArray

                ));

                dtm123 = (DefaultTableModel) myTable.getModel();

            } else {

                //Add new rows here

                dtm123.addRow(myDataList.get(next).getRowArray());

            }

        }

    }

}

像往常一樣使用publish,但一旦您知道列的標(biāo)題,請調(diào)用publish(-1)以設(shè)置它們(當(dāng)然,在添加行之前)。


查看完整回答
反對 回復(fù) 2023-10-13
  • 1 回答
  • 0 關(guān)注
  • 92 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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