3

ListCellRenderer現在、 のカスタムを作成しようとしていJListます。残念ながら、ほとんどすべての例は単純に as を使用DefaultListCellRendererし、JLabelそれで完了します。ただし、 が必要でしたJPanel(アイコンと 1 行のテキストだけでなく、もう少し多くの情報を表示する必要があるため)。

現在、背景色、特に Nimbus PLAF に問題があります。一見、私が得た背景色list.getBackground()は白ですが、灰色の色合い(または青みがかった灰色)としてペイントされます。取得した色を出力すると、次のようになります。

背景色: DerivedColor(color=255,255,255 親=nimbusLightBackground オフセット=0.0,0.0,0.0,0 pColor=255,255,255

ただし、ご覧のとおり、これはペイントされるものではありません。

代替テキスト

選択したアイテムに対して明らかに正常に機能します。現在、セル レンダラーの戻り値に入れているすべてのコンポーネントを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());
}

それは魔法のように機能します。それで、私がそこに着くのに問題があるかもしれませんDerivedColornimbusLightBackground

4

1 に答える 1

3

JPanels のデフォルトは opaque=true ですが、jLa​​bels のデフォルトは opaque=false です。

そのため、DefaultCellRender が JLabel を使用する場合、その親の背景を取得します。

パネルで opaque を false に設定してみてください。

アップデート:

Nimbus は独自のカスタム ListCellRenderer を使用しています。1つは SOで、もう 1 つはGoogle のコード リポジトリにあります(UpdateUI と NimbusCellRenderer を探してください)。

于 2010-05-07T15:24:05.373 に答える