簡體   English   中英

JList不使用自定義ListModel進行更新

[英]JList not updating with custom ListModel

我有一個擴展AbstractListModel的TestListModel

public class TestListModel extends AbstractListModel {
List<Test> testlist = new ArrayList<Test>();

public Object getElementAt(int arg0) {
    return testlist.get(arg0);
}

public int getSize() {
    return testlist.size();
}
public void add(Test t) {
    System.out.println("adding");
    testlist.add(t);
    System.out.println(testlist.toString());
}
public void remove(Test t) {
    testlist.remove(t);
}

}

我有一個像這樣的JList

final TestListModel listModel = new TestListModel();
    listModel.add(new Test("test", "scen"));
    JPanel panel = new JPanel();
    final JList list = new JList(listModel);
    panel.add(list);
    list.setVisibleRowCount(3);
    list.setFont(new Font("Tahoma", Font.PLAIN, 14));
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setBounds(0, 0, 100, 400);

我還有一個具有動作列表的添加按鈕

public void actionPerformed(ActionEvent arg0) {
final JFileChooser fc = new JFileChooser();fc.setCurrentDirectory(new 
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fc.showOpenDialog(frmAtt);
if(returnVal == JFileChooser.APPROVE_OPTION) {
    listModel.add(getTest(fc.getSelectedFile().toString()));
}
}

當我通過按鈕添加另一個測試時,ArrayList似乎正在更新,但GUI不反映此更改。 JList顯示為完全空白。 它應該顯示模型中的所有測試。

只有第一個測試“sce”顯示在JList中,我手動添加到列表中(可以在上面的代碼中看到)。

更改ListModel的數據后,您不會觸發任何通知方法。 解決方案當然是這樣做的。 在以fireXXX(...)開頭的方法中查看AbstractListModel API,並在數據發生更改時調用模型內部的相應API。 即,在這些方法中:

public void add(Test t) {
    testlist.add(t);
    int index0 = testlist.size() - 1;
    int index1 = index0;
    fireIntervalAdded(this, index0, index1);
}

public void remove(Test t) {
    int index0 = ... // this will depend on where t was in the testlist
    int index1 = ... // ditto
    testlist.remove(t);
    fireIntervalRemoved(this, index0, index1);
}

調用這些方法的原因是因為模型必須通知其偵聽器數據已更改,否則偵聽器(您的JList組件)將不會更改其數據視圖。

暫無
暫無

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

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