Swing JList SetCellRenderer 背景颜色不起作用

Posted

技术标签:

【中文标题】Swing JList SetCellRenderer 背景颜色不起作用【英文标题】:Swing JList SetCellRenderer BackGround Color Not Working 【发布时间】:2018-12-28 16:31:06 【问题描述】:

早上好:

我在 Swing 中有一个带有一些数据的 JList。我从数据库中选择数据,并尝试选择与 JList 中相同的数据并使用另一种颜色,但我已经尝试了所有可能的方法并给了我很多错误。我的代码。

这个数组保存了我想高亮的标签。

 final String[] segmentacion2 = suscriptor.getSegmentacion2().split(";");

这是为了预先选择标签。

 for (int j = 0; j < segmentacion2.length; j++)
     
         listaSegmentacion2.setSelectedValue(segmentacion2[j], true);
     


     listaSegmentacion2.setCellRenderer(new DefaultListCellRenderer() 

         @Override
         public Component getListCellRendererComponent(JList list,
                 Object value, int index, boolean isSelected,
                 boolean cellHasFocus) 

             super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
         for (int j = 0; j < segmentacion2.length; j++)
             
                 listaSegmentacion2.setSelectedValue(segmentacion2[j], true);
             

             System.out.println(isSelected);
             if(isSelected)
             
                 setBackground(Color.green);
             
             else
             
                 setBackground(null);
             
           return this;
         
     );

我得到的错误是:

Exception in thread "AWT-EventQueue-0" java.lang.***Error
at javax.swing.UIDefaults.getFromHashtable(Unknown Source)
at javax.swing.UIDefaults.get(Unknown Source)
at javax.swing.MultiUIDefaults.get(Unknown Source)
at javax.swing.UIManager.get(Unknown Source)
at sun.swing.DefaultLookup.get(Unknown Source)
at sun.swing.DefaultLookup.getBorder(Unknown Source)
at sun.swing.DefaultLookup.getBorder(Unknown Source)
at javax.swing.DefaultListCellRenderer.getNoFocusBorder(Unknown Source)
at javax.swing.DefaultListCellRenderer.getListCellRendererComponent(Unknown Source)
at com.mypackage.main.Principal$2.getListCellRendererComponent(Principal.java:509)
at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source)
at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.setSelectionInterval(Unknown Source)
at javax.swing.JList.setSelectedIndex(Unknown Source)
at javax.swing.JList.setSelectedValue(Unknown Source)

有什么建议/帮助吗?将不胜感激。谢谢。

【问题讨论】:

请提供minimal reproducible example,以便我们也可以重现您的异常。请不要发布您的整个代码,而是创建一个可运行的小型示例(最多 100-150 行代码)。顺便说一句:setBackground(null) 看起来很丑。请改用setBackground(list.getBackground()) BTW2:必须删除渲染器中对 setSelectedValue(Object) 的调用。我认为 - 这是你的问题的主要原因。 BTW3:如果你只想用绿色背景绘制你的选择,你可以简单地使用JList.setSelectionBackground(Color)方法并完全移除你的渲染器。 这就是我所需要的。非常感谢! 【参考方案1】:

这个数组保存了我想要突出显示的标签。

然后你需要将Array中的数据与正在渲染的数据进行比较。

最简单的方法是将数据从 Array 复制到 Set:

HashSet<String> values = new HashSet<String>();

for (String value: segmentation2)
    values.add( value );

现在在渲染器中的基本逻辑是:

if (!isSelected)
    if (values.contains(value.toString())
        setBackground( Color.GREEN );
    else
        setBackground( null );

这个想法是突出显示基于值,而不是基于选择。

【讨论】:

这就是我所需要的。非常感谢! @DeathGun,很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,以便人们知道问题已解决。

以上是关于Swing JList SetCellRenderer 背景颜色不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Swing 的 JList 的 MVC 实现有问题吗?

Swing JList SetCellRenderer 背景颜色不起作用

如何在Java Swing中创建响应式JList

是否可以更改 Java Swing jList 中项目的名称*显示*?

带有多行文本和动态高度的 Swing JList

swing 的JList里放一个list列表里的数据,遍历一行一行放进JList里,在线等 实例越小越简单,看懂就行