行ごとに複数のテキスト色を表示する 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";