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

Java JList-以红色突出显示特定单元格,java,swing,rendering,cell,jlist,Java,Swing,Rendering,Cell,Jlist,我在表格上有一个JList。加载表单时,JList将填充my array中的项目。这些项目是产品,在产品详细信息旁边有一个“库存数量”编号。 在下面的代码中,我找到了股票编号,如果它小于5,我希望该行以红色突出显示 目前,如果数量少于5,则我的整个Jlist将以红色突出显示。救命!! 我对Java非常陌生,所以请尽可能简单地解释! 如果有人能解释为什么我的代码不能正常工作,那就太好了——我真的不太懂很多“细胞渲染”的东西——我昨天才发现它 public void lowStock(){

我在表格上有一个JList。加载表单时,JList将填充my array中的项目。这些项目是产品,在产品详细信息旁边有一个“库存数量”编号。 在下面的代码中,我找到了股票编号,如果它小于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 void lowStock(){
DefaultListModel列表=新的DefaultListModel();
list=(DefaultListModel)lstProducts.getModel();
int listSize=list.getSize();

对于(int i=0;i,您的问题在于以下代码段:

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);
,则不应设置任何颜色

很难看到到底发生了什么-你应该提交一份报告。这只是几个代码片段

老实说,我认为您要做的是为您的
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;
     }
 }

您正在尝试做很多事情。您根本不需要
地图
。请参见下文,非常简单

当前显示为红色的原因是因为
if
之外有
setBackground
。因此,无论发生什么情况,它都将是红色的。您可以查看有关如何使用列表渲染的详细信息

import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ListColorRed {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Integer[] nums = {10, 2, 5, 8, 2, 9, 2, 8, 10, 4, 6};
                JList list = new JList(nums);
                list.setCellRenderer(new DefaultListCellRenderer() {

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

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

                        Integer num = (Integer) value;

                        if (num < 5) {
                            setBackground(Color.RED);
                        }

                        return this;
                    }
                });

                JOptionPane.showMessageDialog(null, new JScrollPane(list));
            }
        });
    }
}
导入java.awt.Color;
导入java.awt.Component;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.JList;
导入javax.swing.JOptionPane;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
公共类ListColorRed{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
整数[]nums={10,2,5,8,2,9,2,8,10,4,6};
JList列表=新的JList(nums);
setCellRenderer(新的DefaultListCellRenderer(){
@凌驾
公共组件GetListCellRenderComponent(JList列表,
对象值、整型索引、布尔值、,
布尔单元(聚焦){
super.getListCellRenderComponent(列表、值、索引、,
当选,cellHasFocus);
整数num=(整数)值;
if(num<5){
挫折地面(颜色:红色);
}
归还这个;
}
});
showMessageDialog(null,新的JScrollPane(列表));
}
});
}
}

什么时候将背景设置为红色以外的颜色?如果库存少于5个,背景应为红色。如果库存超过5个,背景不应为红色。好的,但什么时候将背景设置为红色以外的颜色?在我看来,无论发生什么情况,你都会将背景设置为红色。不,红色不应为红色他是唯一设置过的颜色。我真的不懂代码-我以前从未使用过HashMap或CellRenderer。你需要将颜色设置为红色以外的颜色。说真的,把第一个红色改为蓝色,看看我的意思。
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ListColorRed {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Integer[] nums = {10, 2, 5, 8, 2, 9, 2, 8, 10, 4, 6};
                JList list = new JList(nums);
                list.setCellRenderer(new DefaultListCellRenderer() {

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

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

                        Integer num = (Integer) value;

                        if (num < 5) {
                            setBackground(Color.RED);
                        }

                        return this;
                    }
                });

                JOptionPane.showMessageDialog(null, new JScrollPane(list));
            }
        });
    }
}