Java JList渲染前/渲染后挂钩?

Java JList渲染前/渲染后挂钩?,java,swing,Java,Swing,我正在JList中进行自定义渲染。我的自定义ListCellRenderer使用一个静态字符串,这样它就可以根据某个变量以前出现的情况测试该变量的值 private static String lastUsername = ""; public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)

我正在JList中进行自定义渲染。我的自定义ListCellRenderer使用一个静态字符串,这样它就可以根据某个变量以前出现的情况测试该变量的值

    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事件/钩子来实现这一点吗?

比较字符串对象与==而不是等于的常见错误。请尝试
if(lastUsername.equals(user.getUsername())

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

声明的属性
static
通常是一个等待出现的错误,很少是一个解决方案。逻辑是错误的:单元格中的任何重绘调用都没有顺序(获取渲染器的调用甚至可能与重绘无关),因此,一般规则是永远不要更改渲染器之外的任何状态。完全同意@AndrewThompson,换言之:你到底想实现什么?我的列表单元格中有一些jLabel,其中一个标签是用户名。例如,如果标签上有用户名John,那么如果以下任何单元格中有用户名标签的值为John,我只想为用户名显示一个空白字符串,只有当我到达用户名不再为John的单元格时,我才会再次显示用户名。如果没有对单元渲染的顺序,看起来这是不可能的。嗯,也许我可以改为检查列表模型数据……这里有一个问题可能会让您了解如何在渲染器中实现您的目标(毕竟:)不是通过设置任何变量,而是通过实际循环值来实现。请注意,
lastUsername==user.getUsername()
lastUsername.equals不同(user.getUsername())
。声明的属性
static
通常是一个等待出现的bug,很少是一个解决方案。逻辑是错误的:单元格重绘调用中没有任何排序(对获取渲染器的调用甚至可能与重绘无关),因此,一般规则是永远不要更改渲染器之外的任何状态。完全同意@AndrewThompson,换言之:您到底想要实现什么?我的列表中的单元格中有一些JLabel,其中一个标签是username。例如,如果标签有username John,那么如果以下任何单元格都有usern使用John作为值的ame标签我只想为用户名显示一个空白字符串,只有当我到达用户名不再为John的单元格时,我才会再次显示用户名。如果单元格渲染没有顺序,看起来这是不可能的。嗯,也许我可以改为检查列表模型数据…这是一个问题这可能会让您了解如何在渲染器中实现目标(毕竟:),不是通过设置任何变量,而是通过实际循环遍历值。注意,
lastUsername==user.getUsername()
lastUsername.equals(user.getUsername())
不同。