2012-03-23 66 views
1

我正在做一个JList自定义渲染。我的自定义ListCellRenderer使用一个静态字符串,以便它可以测试特定变量的值与以前发生该变量的值。JList前/后渲染钩?

private static String lastUsername = ""; 

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     User user = (User)value; 
     if (lastUsername == user.getUsername()) { 
      // Do something 
     } else { 
      // Do something else 
      lastUsername = user.getUsername(); 
     } 

现在,工作正常时,程序首先加载,但如果我然后滚动它会导致问题,因为lastUsername变量仍设置为最后它遇到的,而实际上它应该是一个空字符串的用户名列表。基本上,lastUsername需要在所有单元格渲染之前或之后重置为空字符串。有谁知道是否有一个JList post/pre AllCellsRendered事件/挂钩,我可以重写以实现此目的?

+1

声明为'static'的属性通常是等待出现的错误,很少是解决方案。 – 2012-03-23 08:46:30

+2

逻辑错误:在单元重绘调用中没有排序(并且调用抓取渲染器甚至可能与重绘无关),所以一般规则是_never_在渲染器之外更改任何状态。完全同意@AndrewThompson,用不同的话来说:你想达到什么目的? – kleopatra 2012-03-23 08:54:14

+0

我在列表的单元格中有一些JLabel,其中一个标签用于用户名。例如,如果标签具有用户名John,那么如果以下单元格中的任何一个带有John的用户名标签作为它们的值,我只想为用户名显示一个空白字符串,只有当我到达用户名不再的单元格时John会再次显示用户名。看起来这不是可能,但如果没有单元渲染的顺序。嗯,也许我可以做清单模型数据的检查,而不是... – csss 2012-03-23 09:13:37

回答

1

将字符串对象与==而不是等号进行比较的常见错误。改为尝试if (lastUsername.equals(user.getUsername()))