gpt4 book ai didi

java - Swing ListCellRenderer 中的错误背景颜色

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:58 25 4
gpt4 key购买 nike

我目前正在尝试为 JList 编写自定义 ListCellRenderer。不幸的是,几乎所有示例都简单地将 DefaultListCellRenderer 用作 JLabel 并完成它;但是,我需要一个 JPanel(因为我需要显示的信息比一个图标和一行文本多一点)。

现在我遇到了背景颜色问题,尤其是 Nimbus PLAF。看起来我从 list.getBackground() 获得的背景颜色是白色,但涂成灰色(或蓝灰色)。输出我得到的颜色会产生以下结果:

Background color: DerivedColor(color=255,255,255 parent=nimbusLightBackground offsets=0.0,0.0,0.0,0 pColor=255,255,255

但是,正如所见,这并不是绘制的内容。

alt text

它显然适用于所选项目。目前我什至将我放入 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());
}

它神奇地起作用了。那么也许我到达那里的带有 nimbusLightBackgroundDerivedColor 可能有问题?

最佳答案

JPanels 默认为 opaque=true 而 jLabels 默认为 opaque=false。

因此,当 DefaultCellRender 使用 JLabel 时,它会获得其父级的背景。

尝试在面板上将不透明设置为 false。

更新:

Nimbus 使用自己的自定义 ListCellRenderer。我发现有 2 次提到解决它,one here on SO和一个 Google's code repository (寻找 UpdateUI 和 NimbusCellRenderer)。

关于java - Swing ListCellRenderer 中的错误背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2787781/

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