我有一个JFrame,我已经淹没了背景:
class ImagePanel extends JComponent {
private Image image;
public ImagePanel(Image image) {
this.image = image;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
}
现在我必须列出一些对象,所以我在JScrollPane中添加了一个JList(不确定这是否足够)。
问题是:有没有办法让项目区域(JList和JScrollPane)的背景透明,只显示项目列表?
我尝试了setOpaque的所有变体(false);让viewPort没有得到它等...
P.S。我看到了一个类似的问题,但是有一些类分离。我把所有窗口组件放在一个类中。
答案 0 :(得分:5)
您需要将JList
,JScrollPane
和JScrollPane
的{{1}}全部透明,例如......
JViewport
哦,还有最后一招,您需要将list.setOpaque(false);
JScrollPane sp = new JScrollPane(list);
sp.setOpaque(false);
sp.getViewport().setOpaque(false);
的单元格渲染器替换为未选中的单元格渲染器,例如
JList
public class TransparentListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
setOpaque(isSelected);
return this;
}
}
答案 1 :(得分:0)
您应该创建一个简单的列表单元格渲染器,然后在listName
。setCellRenderer(new YourListCellRenderer());
例如:- 您的列表单元格渲染器代码应如下所示
public class MyListCellRender extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list1, Object obj, int index, boolean isSelected, boolean isFocus) {
super.getListCellRendererComponent(list1, obj, index, isSelected, isFocus);
setForeground(Color.WHITE);
setOpaque(isSelected);
return this;
}
}
然后在想要的任何位置或任何位置调用它,例如表单活动事件或初始阶段,在我的情况下,我在表单创建后的初始阶段调用它。这意味着在initComponent();
之后 initComponents();
jList1.setUI(new WebListUI());
scrollBar.setOpaque(false);
scrollBar.getViewport().setOpaque(false);
jList1.setOpaque(false);
jList1.setCellRenderer(new TransparentListCellRender());