问题 将透明JPanel放在另一个不工作的JPanel之上


我试图将JPanel放在另一个包含JTextArea和按钮的JPanel之上,我希望上层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();
}
}

7973
2017-12-28 11:40


起源

你的意思是什么 on top?究竟什么不起作用? - Nikolay Kuznetsov
这意味着结果仅显示上面板。 - Nikhil
请参阅接受的答案 stackoverflow.com/questions/2669654/... 特别是关于使用BorderLayout的部分...... - PhiLho
你的意思是 半透明? - trashgod


答案:


实际上,告诉您为什么要将面板放在另一个上面是有用的。

从你的代码开始,并且经常更改它,我得到它的工作,但它可能不会做你期望的...

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


5
2017-12-28 12:32





查看本教程的使用方法 Swing Root Panes

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


4
2017-12-28 11:46



@Nikhil:我同意这个答案听起来像你想要的,尽管你还没有真正告诉我们你的要求(或问题)是什么。 - arcy


1)有几种方法,没有问题放JPanel,覆盖满 JFrames/JPanel area 或者只是的一部分 Rectangle / Dimension 返回 JFrames/JPanel

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

  • 使用 GlassPane

  • 使用 JViewport

  • 使用 OverlayLayout

  • 使用transucent JDialog / JWindow 

2)一切都取决于你是否想要防范 mouse 和关键 events 来自 top layer 至 bottom或不(避免 redispatch 事件 from - to 反之亦然)


4
2017-12-28 12:11