12

我试图将一个 JPanel 放在另一个 JPanel 之上,该 JPanel 包含一个 JTextArea 和一个按钮,并且我希望上部 apnel 是透明的。我已经通过制作上面板的 setOpaque(false) 进行了尝试。但它不工作。谁能帮我度过这个难关?提前致谢!

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();
}
}
4

3 回答 3

6

事实上,告诉你为什么想要一个面板一个一个的原因会很有用。

从您的代码开始,并对其进行了很多更改,我让它工作,但它可能无法达到您的预期......

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,但不会阻止鼠标单击。

于 2012-12-28T12:32:22.240 回答
5

1)有几种方法,放置JPanel没有问题,覆盖全部JFrames/JPanel area或部分Rectangle / Dimension返回JFrames/JPanel

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

  • 利用GlassPane

  • 利用JViewport

  • 利用OverlayLayout

  • 使用半透明JDialog / JWindow

2) 一切都取决于您是否要防止mouseeventstop layerto键入密钥bottom(避免redispatch事件from - to,反之亦然)

于 2012-12-28T12:11:26.517 回答
4

查看有关使用Swing Root Panes的本教程。

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

于 2012-12-28T11:46:52.220 回答