簡體   English   中英

更改 JList model (Java swing) 時,JscrollPane 不更新

[英]JscrollPane doesn't update when changing JList model (Java swing)

我有一個帶有自定義 DefaultListModel 的 JList。 JList 在 JTabbedPane 內的 JScrollPane 內。 當我通過添加或刪除元素來更新 model 時,即使 model 已正確更改,我也看不到頁面上的任何更改。

我試圖 revalidate() 和 repaint() 一切都沒有改變。

現在有趣的事情來了。 如果我用 for (int i = 0; i < model.size(); i++) model.get(i) 打印 model 中的所有內容。 但是,如果我將 go 通過我的自定義 model 中的列表公開,則沒有任何改變。

只有當我使用手動填寫的另一個列表創建並設置新的 model 時,我才能查看更新的列表。

TLDR;

在使用 addElement 和 removeElement 修改自定義 DefaultListModel 中的列表后,如何顯示修改后的列表:

for (int i = 0; i < model.size(); i++) {
        System.out.println(model.get(i));
    }

這顯示了原始列表,因此視圖沒有被更新

for (Object object : model.list) {
        System.out.println(object);
    }

我的 DefaultListModel class

public class ObjectListModel extends DefaultListModel
{
    final List<Object> list;

    public ObjectListModel(List<Object> list) {
        this.list = list;
    }

    @Override
    public int getSize() {
        return list.size();
    }

    @Override
   public Object getElementAt(int index) {
        return list.get(index);
    }
}

這是錯誤的:

public class ObjectListModel extends DefaultListModel
{
    final List<Object> list;  // <===== this here

DefaultListModel 已經有一個支持 model 的數據核,因此您的列表字段將忽略並嘗試覆蓋它,但未成功。

關於:

在使用 addElement 和 removeElement 修改自定義 DefaultListModel 中的列表后,如何顯示修改后的列表:

而調用這些方法會修改DefaultListModel默認持有的數據核,絲毫不會改變你自己的list字段。

我建議你要么去掉列表字段,而是將數據傳遞給超級 object,如果需要,包括它的構造函數,或者擴展 AbstractListModel,然后確定,使用你自己的數據核。 如果您確實使用了 AbstractListModel 派生的 class,則必須注意在 model 更改時正確調用通知方法,這是 DefaultListModel 為您處理的事情。

老實說,根據您發布的內容,除非您有問題中未提及的要求,否則我不確定您是否需要擴展 DefaultListModel 或 AbstractListModel ,而只需按原樣使用 DefaultListModel 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM