JScrollPane中的透明JList都在一个类中

我有一个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没有得到它等…

PS我看到了一个类似的问题,但是那里有某种类的分离。我把所有的窗口组件放在一个类中。

你需要让JListJScrollPaneJScrollPaneJViewport都透明,例如……

 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; } } 

透明列表

 package javaapplication1.pkg295; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new TestPane()); DefaultListModel model = new DefaultListModel(); model.addElement("Apple"); model.addElement("Banana"); model.addElement("Pear"); model.addElement("Peach"); model.addElement("Grap"); JList list = new JList(model); list.setCellRenderer(new TransparentListCellRenderer()); list.setOpaque(false); JScrollPane sp = new JScrollPane(list); sp.setOpaque(false); sp.getViewport().setOpaque(false); frame.add(sp); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } 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); setForeground(Color.WHITE); setOpaque(isSelected); return this; } } public class TestPane extends JPanel { private BufferedImage bgImg; public TestPane() { setLayout(new BorderLayout()); try { bgImg = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\MegaTokyo\\Aqua\\200x200\\aria_manga_wallpaper-5541.jpg")); } catch (IOException ex) { ex.printStackTrace(); } } @Override public Dimension getPreferredSize() { return bgImg == null ? new Dimension(200, 200) : new Dimension(bgImg.getWidth(), bgImg.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (bgImg != null) { Graphics2D g2d = (Graphics2D) g.create(); int x = (getWidth() - bgImg.getWidth()) / 2; int y = (getHeight() - bgImg.getHeight()) / 2; g2d.drawImage(bgImg, x, y, this); g2d.dispose(); } } } }