【问题标题】:JCombobox list background color is overriding selected background item colorJCombobox 列表背景颜色覆盖选定的背景项目颜色
【发布时间】:2016-01-04 23:20:46
【问题描述】:

我有一个 JComboBox,每行显示多种文本颜色。我无法使用 HTML 呈现它,因为组合将包含较大的值(导致文本换行)。相反,我创建了一个扩展 JPanel 的自定义渲染器(然后我将不同的 JLabel 添加到具有不同前景色/背景色的该面板)。

为了正确显示颜色,对于每个标签,我必须将 setOpaque 更改为 true。这也会覆盖顶部所选项目的背景颜色:

有没有办法防止这种行为?更改 JPanel 的颜色不会更改顶部的背景颜色,但显然它的子 JLabels 会更改?

渲染器:

import java.awt.Color;
import java.awt.Component;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JList;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

public class CustomComboBoxRenderer extends JPanel implements ListCellRenderer {

    private JLabel[] labels = { new JLabel(), new JLabel(), new JLabel() };

    public CustomComboBoxRenderer() {
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

        for (JLabel label : labels) {
            label.setOpaque(true);
            label.setVerticalAlignment(JLabel.CENTER);
            add(label);
        }
    }

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

        if(value != null) {
            String valueString = value.toString();

            if(valueString.contains("<red>")) {
                int redStart = valueString.indexOf("<red>");
                valueString = valueString.replace("<red>", "");
                int redEnd = valueString.indexOf("</red>");
                valueString = valueString.replace("</red>", "");

                if(redStart > 0) {
                    labels[0].setText(valueString.substring(0, redStart));
                }

                labels[1].setText(valueString.substring(redStart, redEnd));

                if(redEnd < valueString.length()) {
                    labels[2].setText(valueString.substring(redEnd, valueString.length()));
                }
            } else {
                labels[0].setText(valueString);
                labels[1].setText("");
                labels[2].setText("");
            }
        }

        if (isSelected) {
            labels[0].setBackground(list.getSelectionBackground());
            labels[1].setBackground(list.getSelectionBackground());
            labels[2].setBackground(list.getSelectionBackground());

            labels[0].setForeground(list.getSelectionForeground());
            labels[1].setForeground(Color.RED);
            labels[2].setForeground(list.getSelectionForeground());
        } else {
            labels[0].setBackground(list.getBackground());
            labels[1].setBackground(list.getBackground());
            labels[2].setBackground(list.getBackground());

            labels[0].setForeground(list.getForeground());
            labels[1].setForeground(Color.RED);
            labels[2].setForeground(list.getForeground());
        }

        setBackground(list.getBackground());
        return this;
    }
}

要将部分文本设置为红色,使用一个简单的标签:

String comboString = "TEST (<red>Red Text</red>) TEST";

【问题讨论】:

  • 可能只有setOpaque 到true 才被实际选中?考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
  • 解决了它@MadProgrammer。如果您想将该信息转移到答案中,我会将其标记为已解决。

标签: java swing jcombobox listcellrenderer


【解决方案1】:

通常在这种情况下,我只在选择项目时设置不透明状态

setOpaque(isSelected);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多