如何从对象数组中创建GUI列表?

时间:2013-06-02 00:16:50

标签: java arrays swing jlist defaultlistmodel

我有一个对象数组。这些对象很简单,只有两个字符串。我有一个toString()方法,只返回其中一个字符串。

我需要获取该对象数组并使其成为可见的GUI列表,以便用户可以选择其中一个。

在main中,我接受一个长字符串并将其发送到一个解析它的方法并返回一个对象数组。然后我创建一个新的JList,添加它,并使其可见:

JList list = new JList(objects);
list.setVisible(true);
add(list);

然而,没有出现。此时我已经在屏幕上显示了一个GUI。实际上,包含上述代码的类扩展了JPanel。我不确定为什么我什么都没看到,所以我认为我做错了什么。

编辑* *

好的,我的问题是我没有设置模型。但是,在设置模型后,我仍然没有得到任何结果。下面是使用代码的代码:

            ScratchItem[] items = listPlaylists(line2);

            DefaultListModel newListModel = new DefaultListModel();
            for(ScratchItem item : items) {
                newListModel.addElement(item);
            }

            JList list = new JList();
            list.setModel(newListModel);
            list.setVisible(true);
            add(list, BorderLayout.SOUTH);
            invalidate();

2 个答案:

答案 0 :(得分:3)

不是更改JLists,而是保持相同的JList,只需更改模型。如果使用新的字符串填充DefaultListModel并在JList上调用setModel(...),那么你应该很高兴。

例如,

DefaultListModel newListModel = new DefaultListModel();
for (String text : newStringArray) {
   newListModel.addElement(text);
}
originalJList.setModel(newListModel);

修改

你说:

  

我这样做但是我没有得到任何东西。查看我更新的问题

  

好的,我的问题是我没有设置模型。但是,在设置模型后,我仍然没有得到任何结果。下面是使用代码的代码:

        ScratchItem[] items = listPlaylists(line2);

        DefaultListModel newListModel = new DefaultListModel();
        for(ScratchItem item : items) {
            newListModel.addElement(item);
        }

        JList list = new JList();
        list.setModel(newListModel);
        list.setVisible(true);
        add(list, BorderLayout.SOUTH);
        invalidate();

您仍在创建 JList。不要这样做,而是使用我们推荐的 原始 JList。

ScratchItem[] items = listPlaylists(line2);

DefaultListModel newListModel = new DefaultListModel();
for(ScratchItem item : items) {
    newListModel.addElement(item);
}

// JList list = new JList(); // *** don't create a new JList

// originalList refers to the original displayed JList
originalList.setModel(newListModel);

// list.setVisible(true);
// add(list, BorderLayout.SOUTH);
// invalidate();

编辑2
您在评论中说明:

  

没有原始的JList。这是我在程序中创建的第一个。我应该只在构造函数中添加一个,那么这里只更改模型和setVisible(true)?

然后事情变得越来越复杂。如果其他一切都正确,那么问题中的更新代码应该可以正常工作,这表明其他一切都不正确。根据你到目前为止发布的代码片段,很难说出了什么问题。我的建议:

  • 首先,如果您需要在Swing GUI中交换视图,请考虑使用CardLayout,因为这样可以更轻松地进行交换。
  • 其次,如果您与当前结构相关联,那么您需要显示更多代码,最好通过发布一个演示您问题的最小代码示例SSCCE。这将允许我们运行您的代码并对其进行修改,甚至可能更正它。请在回复前阅读链接,因为它提供了有关SSCCE要求的许多重要细节。

答案 1 :(得分:3)

一般

revalidate();
repaint();

适合我。第一行再次放置容器,第二行重新绘制它(你也可以通过调整窗口大小来获得第二个效果)。

但是,您可能应该更改基础模型,而不是每次都替换列表。

"How to Use Lists"开始,"Creating a Model"部分将为您提供列表模型。