java - JList - 以红色突出显示特定单元格

标签 java swing rendering cell jlist

我的表单上有一个 JList。加载表单时,JList 中将填充我的数组中的项目。这些商品是产品,在产品详细信息旁边有一个“库存数量”编号。 在下面的代码中,我找到库存编号,如果它小于 5,我希望该行以红色突出显示。

目前,如果有任何数量少于 5,我的整个 Jlist 就会以红色突出显示。救命!! 我对 Java 还很陌生,所以请尽可能简单地解释一下! 如果有人可以解释为什么我的代码不能正常工作,那就太好了 - 我真的不明白很多“单元格渲染”的东西 - 我昨天才遇到它。

public void lowStock(){
    DefaultListModel<String> list = new DefaultListModel<String>();
    list = (DefaultListModel) lstProducts.getModel();
    int listSize = list.getSize();

    for (int i=0; i<listSize; i++){
        String element = list.get(i);
        int blankSpace = element.lastIndexOf("  ");
        String quantity = element.substring(blankSpace).trim();
        final int intQuantity = Integer.parseInt(quantity);

        if (intQuantity < 5){
            ListCellRenderer lstclrnd;
            lstProducts.setCellRenderer(new DefaultListCellRenderer(){  

            //element.setBackGround(Color.red);
        });
    }
}

class MyListRenderer extends DefaultListCellRenderer  
{  
    private HashMap theChosen = new HashMap();  

    public Component getListCellRendererComponent(JList list,  
            Object value, int index, boolean isSelected,  
            boolean cellHasFocus)  
    {  
        super.getListCellRendererComponent(list, value, index,  
                isSelected, cellHasFocus );  

            theChosen.put( value, "chosen" );  
            setBackground( Color.red ); 
           if( theChosen.containsKey( value ) )  
        {  
            setBackground( Color.red );  
        } 

最佳答案

您的问题在于以下代码:

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

    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);  

    theChosen.put(value, "chosen");  
    setBackground( Color.red ); //MOST LIKELY THIS LINE RIGHT HERE
    if( theChosen.containsKey( value )) {  
        setBackground( Color.red );  
    }
    ...

如果没有该行setBackground( Color.red );,则不应设置颜色。

很难确切地了解发生了什么 - 您应该提交 SSCCE 。这只是几个代码片段。

老实说,我认为您想要做的是为您的JList设置一个ListCellRenderer。像下面这样的东西就足够了。

 class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
     public MyCellRenderer() {
         setOpaque(true);
     }

     public Component getListCellRendererComponent(JList<?> list,
                                                   Object value,
                                                   int index,
                                                   boolean isSelected,
                                                   boolean cellHasFocus) {

         //I don't know why you would have leading whitespace here... but w/e
         //This probably needs modification depending on your data
         String quantity = value.toString().substring(blankSpace).trim();
         setText(quantity);
         int intQuantity = Integer.parseInt(quantity);

         Color background;
         Color foreground;

         if (intQuantity < 5) {
             background = Color.RED;
             foreground = Color.WHITE;

         } else {
             background = Color.WHITE;
             foreground = Color.BLACK;
         }

         setBackground(background);
         setForeground(foreground);

         return this;
     }
 }

然后,您的 JList 可能在初始化后立即需要执行以下操作:

myJList.setCellRenderer(new MyCellRenderer());

关于java - JList - 以红色突出显示特定单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22180574/

相关文章:

java - 无法在 android studio 中打开图像(找不到文件)

java - 为什么 Java repaint() 方法不起作用?

java - 当 ImageIcon(String) 的路径无效时会发生什么 (Java)?

c++ - 如何画出一定粗细的线条

3d - 如何在 JavaFX 中相同地渲染三角形的正面和背面

java - arraylist 中的所有对象都具有相同的值

Java Swing 程序未在 ubuntu 中运行

c# - Sitecore 多个节点用于渲染数据源

java - Spring注解缓存: CacheDecoratorFactory not configured for defaultCache

java - JLabel自定义事件setText