我试图将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();
}
}
实际上,告诉您为什么要将面板放在另一个上面是有用的。
从你的代码开始,并且经常更改它,我得到它的工作,但它可能不会做你期望的...
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,但不会阻止鼠标点击。
查看本教程的使用方法 Swing Root Panes。
当您希望能够捕获事件或绘制已包含一个或多个组件的区域时,玻璃窗格非常有用。例如,您可以通过使玻璃窗格拦截事件来停用多组件区域的鼠标事件。或者,您可以使用玻璃窗格在多个组件上显示图像。
1)有几种方法,没有问题放JPanel,覆盖满 JFrames/JPanel area
或者只是的一部分 Rectangle / Dimension
返回 JFrames/JPanel
2)一切都取决于你是否想要防范 mouse
和关键 events
来自 top layer
至 bottom
或不(避免 redispatch
事件 from - to
反之亦然)