Java Swing透明的JPanels问题

我有一个JLayeredPane,我添加3个JPanels。

我使JPanels透明(没有设置背景和setOpaque(false))。 我在JPanels上绘制线条,只有最后一个JPanel上的线条可见。 通过顶级JPanel看不到其他JPanel的行(即使我在添加它们时添加了不同的zIndex)。

有谁知道这方面的解决方案? 他们为什么不透明?

我创建了一个小测试程序(3个类)。 (TestJPanel和TestJPanel1绘制一条线,但在不同的位置,但我只看到最后添加的JPanel的行。我没有看到2行,因为它不透明:()

Main.Java

import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLayeredPane; public class Main extends JFrame { public Main() { setSize(400, 350); setDefaultCloseOperation(EXIT_ON_CLOSE); JLayeredPane lp = getLayeredPane(); lp.setLayout(new BorderLayout()); TestJPanel top = new TestJPanel(); top.setOpaque(false); TestJPanel middle = new TestJPanel(); middle.setOpaque(false); TestJPanel1 bottom = new TestJPanel1(); bottom.setOpaque(false); lp.add(middle, BorderLayout.CENTER, new Integer(4)); lp.add(top, BorderLayout.CENTER, new Integer(3)); lp.add(bottom, BorderLayout.CENTER, new Integer(2)); // the last one I have added (bottom) is visible and can't see the others through it setVisible(true); } public static void main(String[] args) { new Main(); } } 

TestJPanel.java

 import java.awt.Graphics; public class TestJPanel extends javax.swing.JPanel { /** Creates new form TestJPanel */ public TestJPanel() { initComponents(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawLine(25, 0, 25, 50); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") //  private void initComponents() { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); }//  // Variables declaration - do not modify // End of variables declaration } 

TestJPanel1.java

 import java.awt.Graphics; public class TestJPanel1 extends javax.swing.JPanel { /** Creates new form TestJPanel */ public TestJPanel1() { initComponents(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawLine(50, 0, 50, 50); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") //  private void initComponents() { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); }//  // Variables declaration - do not modify // End of variables declaration } 

我真的希望有人可以帮我解决这个问题。

删除该行

 lp.setLayout(new BorderLayout()); 

并用。替换你的add()调用

 lp.add(component, layer); 

你正在使用LayeredPane错误 – 使用LayeredPane,你(通常)不想设置布局。 我相信(但必须检查)您只看到一行的原因是,使用BorderLayout,如果您将多个组件添加到同一区域(例如BorderLayout.CENTER),则只添加您添加的最后一个组件; 其他人被有效地从布局中删除。

有关更多详细信息,请参阅分层窗格上的Swing教程

您正在将面板添加到同一BorderLayout区域。