2010-04-19 72 views
4

我有一个JLayeredPane,我添加了3个JPanel。Java Swing透明JPanels问题

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

任何人都知道这个解决方案?他们为什么不透明?

我创建了一个小测试程序(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") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    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) 
     ); 
    }// </editor-fold> 


    // 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") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    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) 
     ); 
    }// </editor-fold> 


    // Variables declaration - do not modify 
    // End of variables declaration 

} 

我真的希望有人能帮助我a.s.a.p.有这个问题。

回答

4

删除线

lp.setLayout(new BorderLayout()); 

并更换的add()与

lp.add(component, layer); 

您使用的layeredPane正确调用 - 用的layeredPane,你(通常)不想设置布局。我相信(但必须检查),你只看到一条线的原因是,使用BorderLayout,如果你添加多个组件到同一区域(例如BorderLayout.CENTER),只有你添加的最后一个被定位;其他人从布局中被有效地移除。

有关更多详细信息,请参阅the Swing tutorial on Layered Panes

1

你加入你的面板相同的BorderLayout的区域。