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

时间:2014-03-04 19:00:08

标签: 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 );  
        } 

2 个答案:

答案 0 :(得分:1)

您的问题在于以下代码:

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。这只是几段代码片段。

老实说,我认为你要做的是为ListCellRenderer设置一个JList。如下所示就足够了。

 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());

答案 1 :(得分:1)

你正试图做很多事情。您根本不需要Map。见下文,非常简单。

您目前获得所有红色的原因是因为setBackground之外的if。所以无论发生什么,它都会变红。您可以看到有关如何使用渲染列表

的更多here
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));
            }
        });
    }
}

enter image description here