Java 将一个透明的JPanel放在另一个不工作的JPanel上

Java 将一个透明的JPanel放在另一个不工作的JPanel上,java,swing,jpanel,glasspane,jlayer,Java,Swing,Jpanel,Glasspane,Jlayer,我试着把一个JPanel放在另一个JPanel上面,这个JPanel包含一个JTextArea和一个按钮,我希望上面的部分是透明的。我已经尝试过使上面板的设置不透明(假)。但它不起作用。有谁能帮我渡过难关吗?提前谢谢 public class JpanelTest extends JPanel { public JpanelTest() { super(); onInit(); } private void onInit() { setLayout(new

我试着把一个JPanel放在另一个JPanel上面,这个JPanel包含一个JTextArea和一个按钮,我希望上面的部分是透明的。我已经尝试过使上面板的设置不透明(假)。但它不起作用。有谁能帮我渡过难关吗?提前谢谢

public class JpanelTest extends JPanel
{
    public JpanelTest()
    {
    super();
    onInit();
}
private void onInit()
{
    setLayout(new BorderLayout());

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(new JTextArea(100,100),BorderLayout.CENTER);
    panel.add(new JButton("submit"),BorderLayout.SOUTH);

    JPanel glass = new JPanel();
    glass.setOpaque(false);

    add(panel,BorderLayout.CENTER);
    add(glass,BorderLayout.CENTER);
    setVisible(true);
}

public static void main(String args[])
{
    new JpanelTest();
}
}

查看本教程,了解如何使用

当您希望能够捕捉事件或在已包含一个或多个组件的区域上绘制时,玻璃窗格非常有用。例如,您可以通过让玻璃窗格截获事件来停用多组件区域的鼠标事件。或者,可以使用玻璃窗格在多个组件上显示图像

1) 有几种方法可以放置JPanel,可以覆盖整个
JFrames/JPanel区域
或者只覆盖返回
JFrames/JPanel的部分
矩形/维度

  • 使用
    JLayer(Java7)
    基于
    JXLayer(Java6)

  • 使用
    GlassPane

  • 使用
    JViewport

  • 使用
    overlylayout

  • 使用transucent
    JDialog/JWindow


2) 一切都取决于您是否想防止
鼠标
和按键
事件从
顶层
底层
,或者不想(为了避免
重新修补
事件从-到,反之亦然)

事实上,告诉您为什么需要一个面板而不是另一个面板是很有用的

从您的代码开始,并对其进行了大量更改,我让它开始工作,但它可能不会达到您期望的效果

import java.awt.*;
import javax.swing.*;

public class Test extends JFrame
{
  public Test()
  {
    super();

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 200);

    onInit();

    setVisible(true);
  }
  private void onInit()
  {
    JLayeredPane lp = getLayeredPane();

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(new JTextArea(), BorderLayout.CENTER);
    panel.add(new JButton("Submit"), BorderLayout.SOUTH);
    panel.setSize(300, 150); // Size is needed here, as there is no layout in lp

    JPanel glass = new JPanel();
    glass.setOpaque(false); // Set to true to see it
    glass.setBackground(Color.GREEN);
    glass.setSize(300, 150);
    glass.setLocation(10, 10);

    lp.add(panel, Integer.valueOf(1));
    lp.add(glass, Integer.valueOf(2));
  }

  public static void main(String args[])
  {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        new Test();
      }
    });
  }
}

如果是完全透明的,那么,它就像不在这里一样!例如,当不透明时,它只覆盖部分GUI,但不阻止鼠标单击。

您所说的顶部的
是什么意思?到底是什么不起作用?这意味着结果只显示了上面的面板。请看接受的答案,特别是关于使用BorderLayout的部分……你的意思是什么?@Nikhil:我同意这个答案听起来像是你想要的,尽管你没有真正告诉我们你的要求(或问题)。