gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:53:24 25 4
gpt4 key购买 nike

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

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

enter image description here

有什么办法可以防止这种行为吗?更改 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";

最佳答案

一般在这种情况下,我只在item被选中时才设置不透明状态

setOpaque(isSelected);

关于java - JCombobox 列表背景颜色覆盖选定的背景项目颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com