简体   繁体   English

Java Swing透明的JPanels问题

[英]Java Swing transparent JPanels problem

I'm having A JLayeredPane where I add 3 JPanels. 我有一个JLayeredPane,我添加3个JPanels。

I make the JPanels transparent (no background is set and setOpaque(false)). 我使JPanels透明(没有设置背景和setOpaque(false))。 I draw lines on the JPanels and only the line on the last JPanel which has been added is visible. 我在JPanels上绘制线条,只有最后一个JPanel上的线条可见。 The lines of the other JPanels are not visible through that top JPanel (even if I have added different zIndexes when adding them). 通过顶级JPanel看不到其他JPanel的行(即使我在添加它们时添加了不同的zIndexes)。

Anybody who knows a solution for this? 有谁知道解决方案吗? Why aren't they transparent? 他们为什么不透明?

I have created a little test program (3 classes). 我创建了一个小测试程序(3个类)。 (TestJPanel and TestJPanel1 draw a line but on a different position but I only see the line of the last added JPanel. I don't see 2 lines, because it isn't transparent :( ) (TestJPanel和TestJPanel1绘制一条线但是在不同的位置,但我只看到最后添加的JPanel的行。我没有看到2行,因为它不透明:()

Main.Java 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 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 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

}

I really hope somebody could help me out asap with this problem. 我真的希望有人可以帮我解决这个问题。

Remove the line 删除该行

lp.setLayout(new BorderLayout());

and replace your add() calls with 并用。替换你的add()调用

lp.add(component, layer);

You're using LayeredPane incorrectly - with LayeredPane, you (typically) don't want to set a layout. 你正在使用LayeredPane错误 - 使用LayeredPane,你(通常)不想设置布局。 I believe (but would have to check) that the reason you're only seeing the one line is that, with BorderLayout, if you add multiple components to the same region (eg BorderLayout.CENTER), only the last one you add gets positioned; 我相信(但必须检查)您只看到一行的原因是,使用BorderLayout,如果您将多个组件添加到同一区域(例如BorderLayout.CENTER),则只添加您添加的最后一个组件; the others are effectively removed from the layout. 其他人被有效地从布局中删除。

For more detail, see the Swing tutorial on Layered Panes 有关更多详细信息,请参阅分层窗格上的Swing教程

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM