在JFrame中刷新JList

28

我有一个显示来自向量数据的JList。用户可以添加和删除此向量中的信息。当向量中添加或删除条目时,是否可以刷新JFrame中的JList?目前我的做法是...

 list = new JList(names);
 jframe.add(new JScrollPane(list), BorderLayout.CENTER);

但这并没有将JList刷新为任何新内容。我已经检查过我的向量内容等确实发生了改变,但是列表没有刷新。为什么?我该怎么修复它?


3
你在 JList 中使用的是哪个类作为其模型?ListModel 的工作是在其被更新时通知,以便当底层数据发生更改时 JList 可以重新绘制自己。 - Mike Clark
Mike,如果你把这个放在答案里,我会给它点赞。 - Amir Afghani
4个回答

38

您不应该直接更新Vector。应该直接更改ListModel,然后表格会自动重新绘制。

如果因为Vector的更改而决定重新创建ListModel,则可以通过以下方式更新列表:

list.setModel( theNewModel );

编辑:忘记使用 Vector,直接将数据加载到 DefaultListModel 中:

DefaultListModel model = new DefaultListModel();
model.addElement( "one" );
model.addElement( "two" );
JList list = new JList( model );

现在,每当你需要更改数据时,可以直接使用addElement()、removeElement()或set()方法来更新模型。列表将自动重绘。


10

在修改您的向量后,在 JList 上调用 updateUI


1
不清楚为什么“您不应该”作为答案被接受。当您拥有用户定义的List Element和ListCellRenderer,并且需要调整List Element的某些静音属性的视图时,此方法可行。 - Sam Ginrich
@SamGinrich 这完全是错误的... updateUI 用于更改组件UI,与数据无关。 - kleopatra
@kleoptra 我使用updateUI()进行重绘,这是主题。 - Sam Ginrich

4

我认为我找到了解决JList图形“刷新”的方法。在每次添加或删除JList所持有的模型元素后,请尝试调用此方法。

JList_name.ensureIndexIsVisible(model_name.getSize());


2
这是一个非常棒的解决方案。帮了我很大的忙。 - qmor
1
晚来的评论,但这是一个很棒的答案!调用JList.updateGui()将触发某种重绘,可能会在某些情况下扰乱布局。那个解决方案好多了 :) - ItFreak

-1

每次向量变化时,您可以使用list.setListData(vector)


1
你的例子中,vector是什么? - aBnormaLz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接