Неправильные цвета фона в Swing ListCellRenderer - PullRequest
3 голосов
/ 07 мая 2010

Я сейчас пытаюсь написать пользовательский 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У меня там могут быть проблемы?

1 Ответ

3 голосов
/ 07 мая 2010

JPanels по умолчанию имеет значение opaque = true, в то время как jLabels по умолчанию имеет значение opaque = false.

Итак, когда DefaultCellRender использует JLabel, он получает фон своего родителя.

Попробуйте просто установить непрозрачный на false на вашей панели.

Обновление:

Nimbus использует свой собственный ListCellRenderer. Я нашел 2 упоминания о том, как обойти это, одно здесь на SO и одно в хранилище кода Google (ищите UpdateUI и NimbusCellRenderer).

...