我有一个对象数组。这些对象很简单,只有两个string对象。我有一个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();
与其更改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要求的重要细节。
通常
revalidate();
repaint();
适合我。第一行再次布局容器,第二行重新绘制它(您也可以通过调整窗口大小来获得第二行的效果)。
但是,您可能应该更改底层模型,而不是每次都替换列表。
从"如何使用列表"中,"创建模型"一节将让您开始使用列表模型。