JList突出显示行问题

时间:2014-05-23 13:06:13

标签: java forms swing jlist listcellrenderer

我试图突出显示JList中已匹配的所有行"在其他地方使用数据,并禁用该行。 当我调试时,我可以看到在cbNameIsMatched中设置了正确的数据。然而,相反的是,在我创建第一个匹配之后,我在JList中选择的每一行都被突出显示而不是带有"匹配的"指数。 setEnabled还设置了从列表末尾到我在列表中单击的所有项目。

class MyListCellRenderer extends JLabel implements ListCellRenderer
        {
            public MyCopybookListCellRenderer()
            {
                setOpaque(false);
            }

            @Override
            public Component getListCellRendererComponent(JList paramList, Object value,
                    int index, boolean isSelected, boolean cellHasFocus) 
            {
                setText(value.toString());

                if(isSelected)
                {
                    setOpaque(true);
                }
                else
                {
                    setOpaque(false);
                }

                if(cbNameIsMatched[index]==2)
                {
                    setBackground(Color.YELLOW);
                    setEnabled(false);                      
                }

                myList.repaint();

                return this;
            }

2 个答案:

答案 0 :(得分:2)

你会更好地将DefaultListCellRenderer扩展到JLabel,因为前者已经处理好所有事情,你所要做的就是改变你需要的具体事情。它为您未触摸的案例提供了“安全网”。

public class GetterText extends JFrame {

    GetterText() {

        JList<String> list = new JList<>(new String[]{"AAAA", "BBBB", "CCCC", "DDDD"});
        list.setCellRenderer(new MyListCellRenderer());

        getContentPane().add(list);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    private class MyListCellRenderer extends DefaultListCellRenderer {

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

            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            label.setOpaque(isSelected); // Highlight only when selected
            label.setOpaque(true); // Highlight always
            if(index == 2) { // I faked a match for the second index, put you matching condition here.
                label.setBackground(Color.YELLOW);
                label.setEnabled(false);     
            }
            return label;
        }
    }

    public static void main(String[] args) {

        new GetterText();
    }
}

编辑:详细说明super

的使用情况

super提供了可用于调用其方法的超类的引用。覆盖超类的方法时,调用该超类的方法意味着“执行之前执行的操作”,或者“保留实现”。这很好,因为你从一切都是默认的开始,剩下要做的就是调整特定的行为,而不需要照顾其他所有行为。

在这种情况下,如果您在

之后返回label
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

您将获得默认行为,因为它是扩展DefaultListCellRenderer使用的行为。参数是相同的,以获得与超类给出的相同的结果。然后我继续更改此默认JLabel。您所做的是创建一个没有默认行为的新JLabel。请注意,我知道Component返回的DefaultListCellRenderer.getListCellRendererComponentJLabel,从而“欺骗”。

答案 1 :(得分:1)

ListCellRenderer就像一张邮票。重用具有相同数据的相同实例。你必须每次都设置正确的颜色。

if(cbNameIsMatched[index]==2)
{
    setBackground(Color.YELLOW);
    setEnabled(false);                      
}
else
{
    setBackground(your default color);
    setEnabled(true);                      
}