当前位置: 首页 > 面试题库 >

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

荆利
2023-03-14
问题内容

我想在应用程序处理时发出加载消息,因此我在上使用JPanelJTree。但是,当用户单击时JPanelJTree将选择,然后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);


 类似资料:
  • 我在写一个简单的信息管理程序的代码。我在Java swing GUI中遇到了麻烦。在这段代码中,我计划在Northpanel_center中使用JTextField字符串,以便在NorthPanel_East中使用。但我不能用它。 要补充的是,类似这样的搜索方法。

  • 我正在制作这个基于控制台的游戏。 但我不明白这一点,也不明白为什么这样做是错误的。 所以基本上我有10个房间,所以一个房间有以下东西: -房间号码 -hashmap,其中包含一个Room作为值和一个String作为键 现在的问题是,一个房间可以从4个方向北、东、南、西退出,所以这是哈希图中的字符串/键。 它也可以有2个出口或1或3个。 所以在那个哈希图中,我将方向保存为键和值另一个房间对象,这样我

  • Navicat 还能让你管理其他 SQLite 对象:索引和触发器。在主窗口的主工具栏点击相应的按钮来打开对象列表。

  • Navicat 还能让你管理其他 SQL Server 对象:索引、同义词、触发器、备份设备、链接服务器、服务器触发器、程序集、数据库触发器、分区函数和分区方案。在主窗口中,点击 “其他”,然后选择一个对象来打开对象列表。

  • Navicat 还能让你管理其他 PostgreSQL 对象:聚合、转换、域、索引、运算符、运算符类别、序列、触发器、表空间、编制和语言。在主窗口中,点击 “其他”,然后选择一个对象来打开对象列表。

  • Navicat 还能让你管理其他 Oracle 对象:数据库链接、索引、Java、实体化视图日志、序列、同义词、触发器、类型、XML 架构、目录、公用数据库链接、公用同义词和表空间。在主窗口中,点击 “其他”,然后选择一个对象来打开对象列表。