小编典典

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

java

我想在应用程序处理时发出加载消息,因此我在上使用JPanelJTree。但是,当用户单击时JPanelJTree将选择,然后JPanel将转到后面。隐藏后JPanel,它将不再显示。我不知道为什么,但是似乎永远不会走到JTree

我需要一种将JPanel一切摆在最前面的方法。我怎样才能做到这一点?

编辑: 另外,我必须提到,我不需要JDialog。我想使用JPanel任何元素的顶部显示加载消息,直到过程完成。


阅读 213

收藏
2020-11-19

共1个答案

小编典典

因此,这里至少有两个解决方案。要么按照@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);
2020-11-19