1

我有一个对象数组。这些对象很简单,只有两个字符串。我有一个 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();
4

2 回答 2

3

与其更改 JList,不如保留相同的 JList,而只是更改模型。如果你用你的新字符串填充 DefaultListModel 并调用setModel(...)JList,你应该很高兴。

例如,

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 要求的许多重要细节。
于 2013-06-02T00:49:35.230 回答
3

通常

revalidate();
repaint();

为我工作。第一行再次对容器进行布局,第二行重新绘制它(您也可以通过调整窗口大小来获得第二行的效果)。

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

“如何使用列表”开始,“创建模型”部分将帮助您开始使用列表模型。

于 2013-06-02T01:25:52.243 回答