当前位置: 首页 > 知识库问答 >
问题:

JCombobox 列表背景颜色覆盖选定的背景项颜色

经嘉
2023-03-14

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

为了正确显示颜色,对于每个标签,我必须将 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";

共有1个答案

阎善
2023-03-14

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

setOpaque(isSelected);
 类似资料:
  • 在超文本标记语言中,我什么时候使用颜色,背景颜色和背景标签有什么区别? 有什么区别?

  • background(int $color, int $pattern = self::PATTERN_SOLID): self int $color $format = new \Vtiful\Kernel\Format($fileHandle); ​ $backgroundStyle = $format->background( \Vtiful\Kernel\Format::COLO

  • 我正在制作一个基于文本的游戏,用户输入文本来解决游戏。我决定使用JavaSwing来显示文本,我希望文本窗格的背景为黑色。我已经尝试了所有我发现的东西(注释掉了),但是没有一个看起来有效。 这里没有显示导入的图片,但是当我使用任何被注释掉的部分运行游戏时,游戏中没有错误。

  • 背景颜色是背景应用中最基础的属性,使用 background-color属性,几乎可以为任何元素定义背景颜色,该属性不能被继承,其默认值是 transparent,即透明背景。也就是说,如果一个元素没有显式定义背景颜色,那么其背景是透明的,就可以透过该元素看到其祖先元素的背景。 background-color属性接受任意合法的CSS颜色值,如预定义的颜色名、十六进制数值、RGB值、RGB百分比、

  • 我有一个选择框,当选择框被单击并显示所有选项时,我正在尝试更改选项的背景颜色。

  • 通过RGB值设置背景的颜色。 默认的颜色是 0x000000: // 颜色的参数可以是字符串 "#530000" 或者是十六进制数值 0x530000 controller.setBackgroundColor("#530000); //controller.setBackgroundColor(0x530000);

  • 问题内容: 我有一个。当用户悬停div时,我想用rgba颜色()覆盖背景图像。 我想知道是否有一个一格解决方案(即没有多个div,一个用于图像,一个用于颜色,等等)。 我尝试了多种方法: 而这个CSS: 我看到的唯一选择是制作另一个具有覆盖层的图像,使用JavaScript预加载然后使用。但是,我想要一个仅CSS的解决方案(更整洁;更少的HTTP请求;更少的硬盘)。有没有? 问题答案: Peter

  • 问题内容: 假设我要在CSS中渲染箭头,箭头应具有头部,尾部和灵活的宽度,以便可以包含文本。我当然可以创建多个div来获得所需的内容,但是如何在CSS3中完成呢? 我可以使用多个背景图片: 的HTML: 这给了我一个带有箭头和尾巴的透明中间部分。似乎不可能在中间部分指定颜色。 仅使用一张背景图像,您可以执行以下操作: 我知道这在很多方面都是可行的,但是背景颜色属性是否真的从速记定义中丢失了? 问题