Я сейчас пытаюсь написать пользовательский ListCellRenderer
для JList
.К сожалению, почти все примеры просто используют DefaultListCellRenderer
как JLabel
и с этим покончено;Однако мне нужно было JPanel
(поскольку мне нужно отобразить немного больше информации, чем просто значок и одну строку текста).
Теперь у меня проблема с цветами фона, особенно с Nimbus PLAF,Кажется, цвет фона, который я получаю от list.getBackground()
, белый, но окрашивается в оттенок серого (или голубовато-серого).Вывод цвета, который я получаю, дает следующее:
Цвет фона: DerivedColor (color = 255,255,255 parent = nimbusLightBackground offsets = 0,0,0,0,0,0,0 pColor = 255,255,255
Однако, как видно, это не то, что окрашивается.
альтернативный текст http://hypftier.de/dump/jlist_renderer_background.png
Очевидно, что он отлично работает для выбранного элемента. В настоящее время у меня даже есть все компоненты, которые я помещаю вJPanel
средство визуализации ячеек возвращает значение непрозрачный с правильными цветами переднего плана и фона - безрезультатно.
Есть идеи, что я здесь не так делаю?
ETA: Пример кода, который, как мы надеемся, запускается.
public class ParameterListCellRenderer implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// some values we need
Border border = null;
Color foreground, background;
if (isSelected) {
background = list.getSelectionBackground();
foreground = list.getSelectionForeground();
} else {
background = list.getBackground();
foreground = list.getForeground();
}
if (cellHasFocus) {
if (isSelected) {
border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");
}
if (border == null) {
border = UIManager.getBorder("List.focusCellHighlightBorder");
}
} else {
border = UIManager.getBorder("List.cellNoFocusBorder");
}
System.out.println("Background color: " + background.toString());
JPanel outerPanel = new JPanel(new BorderLayout());
setProperties(outerPanel, foreground, background);
outerPanel.setBorder(border);
JLabel nameLabel = new JLabel("Factory name here");
setProperties(nameLabel, foreground, background);
outerPanel.add(nameLabel, BorderLayout.PAGE_START);
Box innerPanel = new Box(BoxLayout.PAGE_AXIS);
setProperties(innerPanel, foreground, background);
innerPanel.setAlignmentX(Box.LEFT_ALIGNMENT);
innerPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
JLabel label = new JLabel("param: value");
label.setFont(label.getFont().deriveFont(
AffineTransform.getScaleInstance(0.95, 0.95)));
setProperties(label, foreground, background);
innerPanel.add(label);
outerPanel.add(innerPanel, BorderLayout.CENTER);
return outerPanel;
}
private void setProperties(JComponent component, Color foreground,
Color background) {
component.setOpaque(true);
component.setForeground(foreground);
component.setBackground(background);
}
}
Странная вещь, если я делаю
if (isSelected) {
background = new Color(list.getSelectionBackground().getRGB());
foreground = new Color(list.getSelectionForeground().getRGB());
} else {
background = new Color(list.getBackground().getRGB());
foreground = new Color(list.getForeground().getRGB());
}
, это волшебным образом работает. Так что, возможно, DerivedColor
с nimbusLightBackground
У меня там могут быть проблемы?