我想在应用程序处理时发出加载消息,因此我在上使用JPanel了JTree。但是,当用户单击时JPanel,JTree将选择,然后JPanel将转到后面。隐藏后JPanel,它将不再显示。我不知道为什么,但是似乎永远不会走到JTree。
JPanel
JTree
我需要一种将JPanel一切摆在最前面的方法。我怎样才能做到这一点?
编辑: 另外,我必须提到,我不需要JDialog。我想使用JPanel任何元素的顶部显示加载消息,直到过程完成。
JDialog
因此,这里至少有两个解决方案。要么按照@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);