[英]Bring JPanel to front of other objects in java (SWING)
我想在应用程序处理时发出加载消息,因此我在JTree
使用了JPanel
。 但是,当用户单击JPanel
,将选择JTree
,并且JPanel
将转到后面。 隐藏JPanel
,它将不再显示。 我不知道为什么,但是似乎它永远不会出现在JTree
前面。
我需要一种将JPanel
置于一切之上的方法。 我怎样才能做到这一点?
编辑:另外,我必须提到,我不需要JDialog
。 我想在任何元素之上使用JPanel
来显示加载消息,直到过程完成为止。
因此,这里至少有两个解决方案。 要么按照@Geoff和@sthupahsmaht的建议去做。 顺便说一句,也可以使用JOptionPane,它会自动为您创建一个对话框。
另一种选择是使用框架中的GlassPane。
或另一个选择是使用@@ zzd建议的JLayeredPane。
编辑:显示如何使用GlassPane捕获用户选择的示例。 请尝试以下步骤:
1.左键单击开始时可见的玻璃窗格。 查看输出。
2.右键单击它。 这将隐藏玻璃窗格。
3.左键单击内容窗格。 查看输出。
4.右键单击它。 转到第1点。尽情享受。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class OverPanel extends JPanel
{
private static void createAndShowGUI()
{
final JFrame f = new JFrame();
f.setPreferredSize(new Dimension(400, 300));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel glassPanel = new JPanel();
glassPanel.setBackground(Color.RED);
glassPanel.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
super.mousePressed(e);
System.out.println("f.getGlassPane() mousePressed");
if(e.getButton() == MouseEvent.BUTTON3)
f.getGlassPane().setVisible(false);
}
});
f.setGlassPane(glassPanel);
f.getContentPane().setBackground(Color.GREEN);
f.getContentPane().addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
super.mousePressed(e);
System.out.println("f.getContentPane() mousePressed");
if(e.getButton() == MouseEvent.BUTTON3)
f.getGlassPane().setVisible(true);
}
});
f.getGlassPane().setVisible(true);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
}
EDIT2 :如果您想产生对话框效果,可以通过适当地将此代码合并到我的示例中来实现。
JPanel panel = new JPanel(new GridLayout(0, 1));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
panel.setBackground(Color.YELLOW);
panel.add(new JLabel("I am message Label"));
panel.add(new JButton("CLOSE"));
JPanel glassPanel = new JPanel(new GridBagLayout());
glassPanel.setOpaque(false);
glassPanel.add(panel);
您需要使用JLayeredPane
将组件移到彼此前面。
这是一个教程: 如何使用分层窗格
禁用玻璃窗格可能会帮助您。
还不清楚代码的组织方式。 但是,听起来您可能想要模态对话框。 这是带有大量参考资源的类似讨论的链接。
Jpanel main = new JPanel();
Jpanel a = new JPanel();
JPanel b = new Jpanel();
main.add(a);
main.add(b);
此时对象:
a -> 0 ( index)
b -> 1 (index)
main.getComponentCount() = 2
main.setComponentZorder(b,0);
a -> 1
b -> 0;
b OVER
a DOWN
对于那些使用JDialog
没问题的人,这是一种确定的方法,可以在出现问题时显示它。 只要确保对话框是模态对话框,布置,设置焦点等时正确控制它即可。
JDialog dialog = new JDialog();
dialog.setAlwaysOnTop(true);
使用JXLayer
或JIDE Overlayable
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.