gpt4 book ai didi

java - JPanel 上带有图像的透明 JList 和标签

转载 作者:行者123 更新时间:2023-12-02 09:32:52 25 4
gpt4 key购买 nike

我在自学的一个小练习中遇到了困难:我有一个 JPanel,其中包含由 g.paint() 绘制的图像。在此 JPanel 上,我有另一个包含实际内容的 JPanel (componentsPanel):一个 JList 和一个 JLabel我想要透明,所以只有内容可见(这些元素没有背景)

这是我的类(class):

JPanel 及其组件

private void initializeNormalPanel() {
normalPanel = new JPanel() {
@Override
public void paint(Graphics g) {
super.paint(g);
Image i, scaled = null;
try {
i = ImageIO.read(new URL("image-from-url"));
scaled = i.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
} catch (IOException e) {
e.printStackTrace();
}
g.drawImage(scaled, 0, 0, null);
}
};
CustomListModel listModel = new CustomListModel();

//m1-m10 is the sample data
listModel.addElement(m1);
listModel.addElement(m2);
listModel.addElement(m3);
listModel.addElement(m4);
listModel.addElement(m5);
listModel.addElement(m6);
listModel.addElement(m7);
listModel.addElement(m8);
listModel.addElement(m9);
listModel.addElement(m10);

JList list = new JList(listModel) {
@Override
public boolean getScrollableTracksViewportWidth() {
return true;
}
};
list.setCellRenderer(new CustomListCellRenderer());

ComponentListener l = new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
list.setFixedCellHeight(10);
list.setFixedCellHeight(-1);
}
};

list.addComponentListener(l);
normalPanel.setVisible(true);
normalPanel.setLayout(new BoxLayout(normalPanel, BoxLayout.PAGE_AXIS));
JPanel componentsPanel = new JPanel(new BorderLayout());
JLabel timeLabel = new JLabel("Aktuelle Zeit", SwingConstants.CENTER);
displayCurrentTime(timeLabel);
list.setOpaque(false);
componentsPanel.add(list, BorderLayout.WEST);
componentsPanel.add(timeLabel, BorderLayout.NORTH);
list.setOpaque(false);
timeLabel.setOpaque(false);
timeLabel.setFont(new Font("Arial", Font.PLAIN, 25));

normalPanel.add(componentsPanel);
}

我还有一个自定义的ListCellRenderer:

@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean hasFocus) {
final Meeting text = (Meeting) value;
lt.setText(pre + value.toString());
setOpaque(false);
return p;
}

我无法实现我的目标,我总是看到列表和标签的背景。我尝试了 setOpaque true 和 false 的每种组合,有人可以帮助我使我的组件透明吗?

最佳答案

  1. 自定义绘画是通过重写paintComponent()而不是绘画来完成的。
  2. 不要在绘画方法中执行 I/O。您不想每次需要重新绘制组件时都继续读取图像。
  3. JLabel 默认情况下是透明的(其他 Swing 组件则不是)。

I always see the background of the List and Label.

normalPanel.add(componentsPanel);

我不明白你在哪里使 ComponentsPanel 透明。因此组件面板的背景将绘制在普通面板的顶部。

你还需要 ComponentsPanel 吗?为什么你不能在设置布局管理器后直接将 JLabel 和 JList 添加到你的 normalPanel 中。

因此,首先确保它与 JLabel 兼容,因为它默认是透明的。一旦成功,您就知道您拥有正确的布局。然后,如果 JList 不起作用,您就知道存在渲染器问题。

关于java - JPanel 上带有图像的透明 JList 和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807364/

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