【问题标题】:JList not updating with custom ListModelJList 未使用自定义 ListModel 更新
【发布时间】:2013-05-15 21:33:53
【问题描述】:

我有一个扩展 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);

我还有一个带有 actionlister 的添加按钮

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 显示为完全空白。它应该显示模型中的所有测试。

只有第一个测试“场景”出现在我手动添加到列表中的 JList 中(可以在上面的代码中看到)。

【问题讨论】:

    标签: java swing jlist


    【解决方案1】:

    更改 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 组件)将不会更改其数据视图。

    【讨论】:

    • 确实,(如果他保持这种方式不推荐),他可以自己重新粉刷。
    • @rimero 请澄清您的评论。
    • 我明白了!我刚刚熟悉 Swing。感谢您的帮助!
    • @Aman:您需要阅读 API 以确切了解它们所代表的内容,但如果您只添加或删除 1 个项目,那么是的,它们是相同的值。
    • @HovercraftFullOfEels,我的意思是你的解决方案是最合适的,因为他没有触发事件。如果假设他直接实现了一个 ListModel,他将不得不自己重新绘制列表。如果没有你的答案,他也可以尝试重新绘制,他会注意到 JList 中反映了值......希望它足够清楚。
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多