Java JList突出显示行问题

Java JList突出显示行问题,java,forms,swing,jlist,listcellrenderer,Java,Forms,Swing,Jlist,Listcellrenderer,我试图突出显示JList中与其他地方的数据“匹配”的所有行,并禁用该行。 调试时,我可以看到cbNameIsMatched中设置了正确的数据。但是,在创建第一个匹配后,我在JList中选择的每一行都会高亮显示,而不是带有“matched”索引的那一行。setEnabled也为从列表末尾到我在列表中单击的位置的所有项目设置 class MyListCellRenderer extends JLabel implements ListCellRenderer {

我试图突出显示JList中与其他地方的数据“匹配”的所有行,并禁用该行。 调试时,我可以看到cbNameIsMatched中设置了正确的数据。但是,在创建第一个匹配后,我在JList中选择的每一行都会高亮显示,而不是带有“matched”索引的那一行。
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;
            }

ListCellRenderer
的作用类似于戳记。重复使用具有相同数据的相同实例。每次都必须设置正确的颜色

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

ListCellRenderer
的作用类似于戳记。重复使用具有相同数据的相同实例。每次都必须设置正确的颜色

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

ListCellRenderer
的作用类似于戳记。重复使用具有相同数据的相同实例。每次都必须设置正确的颜色

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

ListCellRenderer
的作用类似于戳记。重复使用具有相同数据的相同实例。每次都必须设置正确的颜色

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

您最好将
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();
    }
}

您将获得默认行为,因为它是扩展
DefaultListCellRenderer
所使用的行为。为了得到与超类相同的结果,参数是相同的。然后我继续更改此默认值
JLabel
。您要做的是创建一个没有默认行为的新
JLabel
。注意我“作弊”这里,通过了解由
DefaultListCellRenderer.getListCellRendererComponent
返回的
组件是一个
JLabel
,您最好在
JLabel
上扩展
DefaultListCellRenderer
,因为前者已经处理了所有事情,您所要做的就是更改特定的你需要的东西。它给了你一个“安全网”来保护你没有碰过的箱子

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

您将获得默认行为,因为它是扩展
DefaultListCellRenderer
所使用的行为。为了得到与超类相同的结果,参数是相同的。然后我继续更改此默认值
JLabel
。您要做的是创建一个没有默认行为的新
JLabel
。注意我“作弊”这里,通过了解由
DefaultListCellRenderer.getListCellRendererComponent
返回的
组件是一个
JLabel
,您最好在
JLabel
上扩展
DefaultListCellRenderer
,因为前者已经处理了所有事情,您所要做的就是更改特定的你需要的东西。它给了你一个“安全网”来保护你没有碰过的箱子

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

您将获得默认行为,因为它是扩展
DefaultListCellRenderer
所使用的行为。为了得到与超类相同的结果,参数是相同的。然后我继续更改此默认值
JLabel
。您要做的是创建一个没有默认行为的新
JLabel
。注意我“作弊”这里,通过了解由
DefaultListCellRenderer.getListCellRendererComponent
返回的
组件是一个
JLabel
,您最好在
JLabel
上扩展
DefaultListCellRenderer
,因为前者已经处理了所有事情,您所要做的就是更改特定的你需要的东西。它给了你一个“安全网”来保护你没有碰过的箱子

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

您将获得默认行为,因为它是扩展
DefaultListCellRenderer
所使用的行为。为了得到与超类相同的结果,参数是相同的。然后我继续更改此默认值
JLabel
。您要做的是创建一个没有默认行为的新
JLabel
。请注意,我在这里“作弊”,因为我知道由
DefaultListCellRenderer.getListCellRendererComponent
返回的
组件是
JLabel

我已经完成了该步骤,但现在我无法显示在想要进行匹配时选择了同一列表中的项目。setOpaque()似乎还可以确定是否显示任何内容,因此正确的顺序也很重要……换句话说,列表在匹配后会突出显示正确的项目,但我看不到我所做的选择,即setOpaque没有做任何事情,我已经完成了这一步,但现在我无法显示在同一个列表中的项目,当我想进行匹配时,该列表被选中。setOpaque()似乎还可以确定是否显示任何内容,因此正确的顺序也很重要……换句话说,列表在匹配后会突出显示正确的项目,但我看不到我所做的选择,即setOpaque没有做任何事情,我已经完成了这一步,但现在我无法显示在同一个列表中的项目,当我想进行匹配时,该列表被选中。setOpaque()似乎还可以确定是否显示任何内容,因此正确的顺序也很重要……换句话说,列表在匹配后会突出显示正确的项目,但我看不到我所做的选择,即setOpaque没有做任何事情,我已经完成了这一步,但现在我无法显示在同一个列表中的项目,当我想进行匹配时,该列表被选中。setOpaque()似乎还决定是否显示任何内容,因此正确的顺序似乎也很重要……换句话说,列表在匹配后高亮显示正确的项目,但我看不到我所做的选择,即setOpaque没有做任何事情使用
setOpaque(isSelected)
代替
if-else
@user1803551啊,这是个好主意,谢谢。没问题。我