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

Shi*_*TCo 6 java swing jpanel

我想在应用程序处理时发出加载消息,所以我使用JPanel了a JTree.但是当用户点击时JPanel,JTree将会选择并将JPanel返回到后面.隐藏后JPanel,它再也没有显示出来.我不知道为什么,但它似乎永远不会走在前面JTree.

我需要一种方法来把JPanel所有东西都带到前面.我怎样才能做到这一点?

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

Bor*_*oro 8

所以这里至少有两个解决方案.或者选择@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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑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);
Run Code Online (Sandbox Code Playgroud)


jzd*_*jzd 5

您需要使用 aJLayeredPane来移动彼此前面的组件。

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