簡體   English   中英

JCombobox列表背景顏色覆蓋選定的背景項顏色

[英]JCombobox list background color is overriding selected background item color

我有一個JComboBox,每行顯示多種文本顏色。 我無法使用HTML呈現它,因為組合將包含大值(導致文本換行)。 相反,我創建了一個自定義渲染器,它擴展了JPanel(然后我將不同的JLabel添加到具有不同前景/背景顏色的面板)。

為了正確顯示顏色,對於每個標簽,我必須將setOpaque更改為true。 這也會覆蓋頂部所選項目的背景顏色:

在此輸入圖像描述

有什么方法可以防止這種行為嗎? 改變JPanel的顏色並不會改變頂部的背景顏色,但顯然它的孩子JLabel呢?

渲染:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM