JList突出行问题



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

您可以更好地将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。请注意,我在这里"作弊",因为我知道DefaultListCellRenderer.getListCellRendererComponent返回的ComponentJLabel

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

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

相关内容

  • 没有找到相关文章

最新更新