0

我试图突出显示 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;
            }
4

2 回答 2

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.

于 2014-05-23T15:43:56.260 回答
1

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

if(cbNameIsMatched[index]==2)
{
    setBackground(Color.YELLOW);
    setEnabled(false);                      
}
else
{
    setBackground(your default color);
    setEnabled(true);                      
}
于 2014-05-23T13:28:26.620 回答