代码之家  ›  专栏  ›  技术社区  ›  juFo

JavaSwing透明JBAND问题

  •  4
  • juFo  · 技术社区  · 14 年前

    我有一个jlayeredpane,其中添加了3个jpanel。

    我使jpanels透明(没有设置背景和setopaque(false))。我在JPanel上画线,只有最后一个JPanel上添加的线是可见的。其他jpanel的行在顶部jpanel中是不可见的(即使我在添加它们时添加了不同的zindex)。

    有谁知道解决办法吗?为什么它们不透明?

    我已经创建了一个小测试程序(3个类)。 (testjpanel和testjpanel1画了一条线,但位置不同,但我只看到最后添加的jpanel的线。我看不到两行,因为它不透明:()

    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
    
    }
    

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Sbodd    14 年前

    删除行

    lp.setLayout(new BorderLayout());
    

    并将add()调用替换为

    lp.add(component, layer);
    

    使用layeredpane不正确-使用layeredpane时(通常)不希望设置布局。我相信(但必须检查)您只看到一行的原因是,对于borderlayout,如果将多个组件添加到同一区域(例如borderlayout.center),则只有最后一个添加的组件得到定位;其他组件有效地从布局中删除。

    有关详细信息,请参见 the Swing tutorial on Layered Panes

        2
  •  1
  •   JRL    14 年前

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