将JPanel带到java中的其他对象(SWING)前面

我想在应用程序进程时进行加载,所以我在JTree上使用了JPanel。 但是当用户点击JPanel时,JTree将选择并且JPanel会转到后面。 隐藏jpanel之后它再也没有显示出来(我不知道为什么!但它似乎永远不会出现在jtree上)。

我需要一种方法来让JPanel前进。 我怎样才能做到这一点?

另外我必须提到我不想要JDialog。 我想使用任何元素的jpanel顶部来显示加载,直到进程完成。

所以这里至少有两个解决方案。 或者选择@Geoff和@sthupahsmaht建议的内容。 BTW也可以使用JOptionPane,它会自动为您创建一个对话框。

另一种选择是使用框架中的GlassPane。

或者另一个选择是使用JLayeredPane作为@jzd建议。

编辑:显示如何使用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(); } }); } } 

编辑2 :如果您想要一个对话框的效果,您可以通过将此代码适当地合并到我的示例中来实现它。

  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将组件移到彼此前面。

这是一个教程: 如何使用分层窗格

残疾人玻璃窗可能会帮助你。

你的代码组织方式还不是很清楚。 但是,听起来你可能想要的是一个modal dialog。 以下是与许多引用资源进行类似讨论的链接。

如何在Swing java中创建JFrame模型

使用JXLayer或JIDE Overlayable

 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