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

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

處理TableModelEvent時是否允許修改JTable的模型?

處理TableModelEvent時是否允許修改JTable的模型?

慕容3067478 2021-08-25 09:50:18
我想知道如何實現(xiàn)這種行為,當該行的特定列中的值更改為某個固定值時,這將讓我從 JTable 中刪除行。我嘗試使用 TableModelListener 來做到這一點,但沒有預期的效果。我的問題與這樣一個事實有關,當我在處理 UPDATE TableModelEvent 的同時修改模型時,我譴責自己處理可能修改的模型(事件源)與事件本身之間的不一致。換句話說,可以根據(jù)表模型的不同狀態(tài)生成事件。void onTableChanged(TableModelEvent tableModelEvent){    MyTableModel model = (MyTableModel)e.getSource();    if ( e.getType() == TableModelEvent.UPDATE){        MyObject myObject = (MyObject)model.getValueAt(e.getFirstRow(), e.getColumn());        if ( myObject.getSomeProperty().equals("DELETE ME")){          model.removeRow(e.getFirstRow()); // does it look like asking for troubles?        }                }}現(xiàn)在想象一下,我們有一個方法可以讓我們一次更新多行。class MyObject {    private String someProperty;    //...getters/setters}class MyTableModel extends AbstractTableModel {    private static int SOME_PROPERTY_COL = 1;         private final List<MyObject> data;    public MyTableModel(List<MyObject> data)    {        this.data = data;    }    //...    void update(int[] modelIndices, String newSomePropertValue)    {        for (int i = 0; i < modelIndices.length; i++){            data[modelIndices[i]].setSomeProperty(newSomePropertyValue);            fireCellUpdated(modelIndices[i], SOME_PROPERTY_COL);        }    }}在 TableModelEvent 中的 rowIndex、colIndex 與第二時間的模型狀態(tài)以及由于調(diào)用 MyTableModel 對象上的 update(int[], String) 方法而接收到的后續(xù)事件之間的這種實現(xiàn)中存在不一致。我相信問題來自這樣一個事實,我嘗試在接收基于此源的某些特定狀態(tài)生成的事件時修改事件源,但這也不是問題,例如,如果指示模式更改的任何事件是與模型修改交錯,以及基于模型舊狀態(tài)生成的其他一些事件?我最終想要實現(xiàn)的是實現(xiàn),它可以讓我根據(jù)表中某列中的值將行從一個表移動到另一個表。所以想象一個單元格是一個組合框,有 2 個值,我們有兩個表,當一個單元格中的值更改為 table1 時,行將從當前表轉移到 table1。我認為使用 TableModelListener 將是正確的解決方案,但我可以看到在此方法中修改模型不是一個好主意,不是嗎?
查看完整描述

1 回答

?
波斯汪

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

model.removeRow(e.getFirstRow()); // does it look like asking for troubles?

將代碼包裝在一個SwingUtilities.invokeLater(...).


現(xiàn)在將代碼添加到事件調(diào)度線程(EDT)的末尾,以便在行刪除完成之前表處理和表模型偵聽器處理可以正常完成。


SwingUtilities.invokeLater(new Runnable()

{

    public void run()

    {

        model.removeRow(e.getFirstRow());

    }

});

此外,在您的update()方法中,您需要以反向模型行順序更新模型的數(shù)據(jù)。這樣,當您刪除行時,索引不正確就沒有問題。


查看完整回答
反對 回復 2021-08-25
  • 1 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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