Java JList仅在最小化或最大化后刷新
我有一个Java JList仅在最小化或最大化后刷新,java,swing,jlist,Java,Swing,Jlist,我有一个JList连接到收藏。 当集合更改时,我需要自动刷新JList。但是我可以看到,我的JList只有在最小化(或最大化)了JFrame之后才会刷新 为什么? 我是Java新手,我正在努力学习 我有以下列表模型的集合: public class UserCollection extends Vector<User> implements ListModel{ private static final long serialVersionUID = 266841057702319
JList
连接到收藏。
当集合更改时,我需要自动刷新JList
。但是我可以看到,我的JList
只有在最小化(或最大化)了JFrame
之后才会刷新
为什么?
我是Java新手,我正在努力学习
我有以下列表模型的集合:
public class UserCollection extends Vector<User> implements ListModel{
private static final long serialVersionUID = 2668410577023194442L;
@Override
public void addListDataListener(ListDataListener arg0) {
System.out.println("add list! --- " +arg0.toString());
}
@Override
public Object getElementAt(int index) {
return this.get(index).getName();
}
@Override
public int getSize() {
return(this.elementCount);
}
@Override
public void removeListDataListener(ListDataListener arg0) {}
}
我可以在控制台上看到收藏的变化,如果我最小化
JFrame
和/或最大化,则JList
会正确刷新…一旦收藏发生变化,请在JList上调用刷新:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jlist.revalidate(); // triggers a repaint of all the items in the JList.
jlistContainer.repaint(); // Not sure if this one is needed
}
});
您的JList型号是如何更新的
[编辑]现在我们有了您的代码,您应该查看AbstractListModel并以相同的方式实现您的模型,或者更好地扩展AbstractListModel
实际上,您将数据添加到集合中,但模型不会收到此更改的通知 如果可以,我建议您使用DefaultListModel作为JList的模型。此模型将随着模型的更改而自动更改视图(JList),并使您的生活更加轻松。如果您必须使用自己创建的集合,那么请查看是否可以让保存它的类扩展AbstractListModel。如果执行此操作,请确保在更改模型中的数据时调用相应的fireXXXX()方法。当您使用add和remove方法添加或删除项时,您正在调用Vector中的方法。这更新了您的模型,但实际的JList无法知道模型已更新,并且需要刷新自身
(我想其他人已经充分解释了如何解决这个问题)多亏了你的帮助,我终于解决了这个问题 这就是我所做的: 1) 在班上做我的作业
public DefaultListModel userList;
我用userList.addElement(用户)
和userList.removelement(用户)
2) 在JFrame
类中,我有:
JList list = new JList();
list.setCellRenderer(new UsersRenderer());
list.setModel(xmppManager.userList);
3) 这是我的用户推荐人
:
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
public class UsersRenderer extends javax.swing.JPanel implements ListCellRenderer {
/**
*
*/
private static final long serialVersionUID = -9210143012283239644L;
public UsersRenderer() {
initComponents();
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
User person = (User) value;
labelUser.setText(person.getName() + " " + person.getAddress());
if (isSelected) {
setBackground(Color.red);
setForeground(Color.white);
} else {
setBackground(Color.white);
setForeground(Color.black);
}
return this;
}
private void initComponents() {
labelUser = new javax.swing.JLabel();
labelUser.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
labelUser.setText("testo");
add(labelUser);
}
private javax.swing.JLabel labelUser;
}
“连接到收藏”是什么意思?关键是如何维护和更改JList的型号?如果您更改了相应的型号,JList将自动更改。你可能想显示代码。我用代码更新了。。。谢谢,抱歉,我是java新手,正在尝试学习。如果模型更新正确,则无需“刷新”JList。这取决于JList中显示的项目。例如,可以使用自定义ListCellRenderer将自定义JPanel添加到JList。在这种情况下,您的JPanel将不会自动重新绘制。我同意气垫船。。如果模型被正确更新,并且模型触发了相应的事件,并且代码在EDT上执行,那么列表将重新绘制自身。嗨,我使用collection是因为下一步我将在getElementAt中返回自定义html格式的文本,例如:公共对象getElementAt(int index){return”“+this.get(index).getName();}我正在尝试AbstractListModel,但我有“AbstractListModel无法解析为类型”的问题,请将您的代码信息以编辑方式发布到原始帖子中,因为代码不能很好地显示为注释。另外,请解释你上述陈述的意思。如果您想在JList中显示图像,那么您可以使用自定义ListCellRenderer(查看教程了解更多信息),并且仍然可以使用DefaultListModel对象来保存数据。关于AbstractListModel,如果您有错误,请再次编辑您的原始帖子,显示您的新代码尝试和实际错误消息。好的,非常感谢。我试试看。对不起,我是新来的,因为我的名声不好,不能给你投票。
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
public class UsersRenderer extends javax.swing.JPanel implements ListCellRenderer {
/**
*
*/
private static final long serialVersionUID = -9210143012283239644L;
public UsersRenderer() {
initComponents();
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
User person = (User) value;
labelUser.setText(person.getName() + " " + person.getAddress());
if (isSelected) {
setBackground(Color.red);
setForeground(Color.white);
} else {
setBackground(Color.white);
setForeground(Color.black);
}
return this;
}
private void initComponents() {
labelUser = new javax.swing.JLabel();
labelUser.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
labelUser.setText("testo");
add(labelUser);
}
private javax.swing.JLabel labelUser;
}