有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java按钮和标签出现在菜单的JPanel上

我真的希望你能帮我解决这个问题。 我在一个NetBeans应用程序中工作,我用一个JPanel创建了一个动画幻灯片菜单,所以我打算让用户显示滑动的菜单,并覆盖应用程序中当前面板的部分内容,用户与菜单交互(按下菜单上的一个按钮),然后再次隐藏菜单幻灯片

隐藏和显示菜单的照片: enter image description here enter image description here

我在这里的问题是,如果菜单(当菜单被释放时)覆盖的内容中有一个jButton或jLabel,它们只是覆盖菜单的内容,它们保持可见,并且它们位于菜单内容的前面

enter image description here

这里的问题:

As you can see the content comes over the content of the menu

我尝试过在菜单出现时使用ButtonOrLabel.setVisible(false)方法,通过隐藏一些按钮和标签来修复它,一旦用户按下隐藏菜单的按钮,它们就会再次被设置为可见,然而维护这是一场噩梦,因为我的应用程序非常大,我需要对每个元素(按钮、翻领、面板等)进行管理当它被释放时,会被菜单覆盖

以下是我的jFrame结构: Here the main panel is the jPanel that will contain the other sub Jpanels that usser would access via the menu
Settings panel is the common panel for all subpanels, it always shows the yellow strip at the top and the Buttons that shows up the menu

我注意到的另一个问题是,当按下某个面板中的按钮或用户调整应用程序窗口的大小时,菜单会在中间弹出。它只是立即出现,没有任何动画

那么我做错了什么?如何完成修复? 谢谢

“编辑后:” 我在这里加入了一些代码来说明这个问题。是MRE版本的主要问题

import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;


public class test extends javax.swing.JFrame {
    
    
    
    public test() {
        initComponents();
        this.setLocationRelativeTo(null);  }

/////// THIS CODE IS GENERATED BY THE IDE/ / // ///////////////////////////////////////////////////////////////////////////
    private void initComponents() {  // You can skip this part, since this is the init of each component
        menu = new javax.swing.JPanel();
        goToA = new javax.swing.JButton();
        hideMenu = new javax.swing.JButton();
        goToA1 = new javax.swing.JButton();
        interfaces = new javax.swing.JPanel();
        sttings = new javax.swing.JPanel();
        keepVisibleAlwaysThisTitle = new javax.swing.JLabel();
        showMenu = new javax.swing.JButton();
        home = new javax.swing.JPanel();
        panelA = new javax.swing.JPanel();
        textArea = new javax.swing.JTextArea();
        cleares = new javax.swing.JButton();
        writes = new javax.swing.JButton();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setAlwaysOnTop(true);
        setBackground(new java.awt.Color(255, 255, 255));
        setBounds(new java.awt.Rectangle(0, 0, 1206, 808));
        setLocation(new java.awt.Point(0, 0));
        setMaximizedBounds(new java.awt.Rectangle(0, 0, 1206, 808));
        setMinimumSize(new java.awt.Dimension(1206, 808));
        setModalExclusionType(java.awt.Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
        setName("Main"); // NOI18N
        setSize(new java.awt.Dimension(1206, 808));
        menu.setBackground(new java.awt.Color(38, 39, 40));
        menu.setAlignmentX(0.0F);
        menu.setAlignmentY(0.0F);
        menu.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        menu.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
        menu.setDoubleBuffered(false);
        menu.setMaximumSize(new java.awt.Dimension(293, 1808));
        menu.setMinimumSize(new java.awt.Dimension(0, 808));
        menu.setPreferredSize(new java.awt.Dimension(295, 808));
        menu.setRequestFocusEnabled(false);
        menu.setVerifyInputWhenFocusTarget(false);
        goToA.setBackground(new java.awt.Color(38, 39, 40));
        goToA.setFont(new java.awt.Font("Dialog", 1, 13)); // NOI18N
        goToA.setForeground(new java.awt.Color(255, 255, 255));
        goToA.setText("GO TO A");
        goToA.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        goToA.setContentAreaFilled(false);
        goToA.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        goToA.setMaximumSize(new java.awt.Dimension(235, 50));
        goToA.setMinimumSize(new java.awt.Dimension(235, 50));
        goToA.setPreferredSize(new java.awt.Dimension(235, 50));
        goToA.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                goToAMouseClicked(evt);            }        });
        goToA.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");             }   });
        hideMenu.setBackground(new java.awt.Color(102, 102, 102));
        hideMenu.setForeground(new java.awt.Color(255, 255, 255));
        hideMenu.setText("CLOSE THE MENU");
        hideMenu.setToolTipText("");
        hideMenu.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        hideMenu.setBorderPainted(false);
        hideMenu.setContentAreaFilled(false);
        hideMenu.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                hideMenuMouseClicked(evt);           }        });
        goToA1.setBackground(new java.awt.Color(38, 39, 40));
        goToA1.setFont(new java.awt.Font("Dialog", 1, 13)); // NOI18N
        goToA1.setForeground(new java.awt.Color(255, 255, 255));
        goToA1.setText("GO TO HOME");
        goToA1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        goToA1.setContentAreaFilled(false);
        goToA1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        goToA1.setMaximumSize(new java.awt.Dimension(235, 50));
        goToA1.setMinimumSize(new java.awt.Dimension(235, 50));
        goToA1.setPreferredSize(new java.awt.Dimension(235, 50));
        goToA1.addMouseListener(new java.awt.event.MouseAdapter() {        });
        goToA1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                goToA1ActionPerformed(evt);            }        });
        javax.swing.GroupLayout menuLayout = new javax.swing.GroupLayout(menu);
        menu.setLayout(menuLayout);
        menuLayout.setHorizontalGroup(
            menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(menuLayout.createSequentialGroup()
                .addGroup(menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(menuLayout.createSequentialGroup()
                        .addGap(28, 28, 28)
                        .addGroup(menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(goToA1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(goToA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(menuLayout.createSequentialGroup()
                        .addGap(72, 72, 72)
                        .addComponent(hideMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(32, 32, 32))        );
        menuLayout.setVerticalGroup(
            menuLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(menuLayout.createSequentialGroup()
                .addGap(102, 102, 102)
                .addComponent(goToA, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 186, Short.MAX_VALUE)
                .addComponent(hideMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(159, 159, 159)
                .addComponent(goToA1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(225, 225, 225))        );
        interfaces.setBackground(new java.awt.Color(255, 255, 255));
        interfaces.setAlignmentX(0.0F);
        interfaces.setAlignmentY(0.0F);
        interfaces.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
        interfaces.setMaximumSize(new java.awt.Dimension(1206, 808));
        interfaces.setMinimumSize(new java.awt.Dimension(100, 808));
        interfaces.setPreferredSize(new java.awt.Dimension(1206, 808));
        interfaces.setLayout(new java.awt.CardLayout());
        sttings.setBackground(new java.awt.Color(255, 255, 255));
        sttings.setAlignmentX(0.0F);
        sttings.setAlignmentY(0.0F);
        sttings.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
        sttings.setMaximumSize(new java.awt.Dimension(1206, 100));
        sttings.setMinimumSize(new java.awt.Dimension(0, 0));
        sttings.setOpaque(false);
        sttings.setPreferredSize(new java.awt.Dimension(1206, 808));
        keepVisibleAlwaysThisTitle.setBackground(new java.awt.Color(238, 206, 62));
        keepVisibleAlwaysThisTitle.setFont(new java.awt.Font("Dialog", 1, 26)); // NOI18N
        keepVisibleAlwaysThisTitle.setForeground(new java.awt.Color(255, 255, 255));
        keepVisibleAlwaysThisTitle.setText("   KEEP THIS TITLE ALWAYS ON TOP");
        keepVisibleAlwaysThisTitle.setMaximumSize(new java.awt.Dimension(interfaces.getWidth(), 40));
        keepVisibleAlwaysThisTitle.setMinimumSize(new java.awt.Dimension(interfaces.getWidth(), 40));
        keepVisibleAlwaysThisTitle.setOpaque(true);
        keepVisibleAlwaysThisTitle.setPreferredSize(new java.awt.Dimension(interfaces.getWidth(), 40));
        showMenu.setText("SHOW MENU");
        showMenu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                showMenuActionPerformed(evt);            }        });
        home.setBackground(new java.awt.Color(255, 255, 255));
        javax.swing.GroupLayout homeLayout = new javax.swing.GroupLayout(home);
        home.setLayout(homeLayout);
        homeLayout.setHorizontalGroup(
            homeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 1206, Short.MAX_VALUE)        );
        homeLayout.setVerticalGroup(
            homeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 808, Short.MAX_VALUE)        );
        panelA.setBackground(new java.awt.Color(255, 255, 255));
        panelA.setAlignmentX(0.0F);
        panelA.setAlignmentY(0.0F);
        panelA.setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
        panelA.setMaximumSize(new java.awt.Dimension(1206, 808));
        panelA.setMinimumSize(new java.awt.Dimension(1206, 808));
        panelA.setPreferredSize(new java.awt.Dimension(1206, 808));
        textArea.setColumns(20);
        textArea.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N
        textArea.setForeground(new java.awt.Color(255, 255, 255));
        textArea.setRows(5);
        textArea.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 212, 57)));
        textArea.setOpaque(false);
        cleares.setText("WIPES THE TEXT BELOW");
        cleares.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                clearesActionPerformed(evt);            }        });
        writes.setText("WRITE A TEXT BELOW");
        writes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                writesActionPerformed(evt);            }        });
        javax.swing.GroupLayout panelALayout = new javax.swing.GroupLayout(panelA);
        panelA.setLayout(panelALayout);
        panelALayout.setHorizontalGroup(
            panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelALayout.createSequentialGroup()
                .addGap(33, 33, 33)
                .addGroup(panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(panelALayout.createSequentialGroup()
                        .addComponent(writes)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(cleares))
                    .addComponent(textArea, javax.swing.GroupLayout.PREFERRED_SIZE, 1140, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(33, Short.MAX_VALUE))        );
        panelALayout.setVerticalGroup(
            panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelALayout.createSequentialGroup()
                .addGap(280, 280, 280)
                .addGroup(panelALayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(writes)
                    .addComponent(cleares))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(textArea, javax.swing.GroupLayout.PREFERRED_SIZE, 416, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(78, Short.MAX_VALUE))        );
        javax.swing.GroupLayout sttingsLayout = new javax.swing.GroupLayout(sttings);
        sttings.setLayout(sttingsLayout);
        sttingsLayout.setHorizontalGroup(
            sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, sttingsLayout.createSequentialGroup()
                .addGap(0, 11, Short.MAX_VALUE)
                .addComponent(showMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(keepVisibleAlwaysThisTitle, javax.swing.GroupLayout.PREFERRED_SIZE, 1076, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(panelA, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(home, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
        sttingsLayout.setVerticalGroup(            sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(sttingsLayout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(keepVisibleAlwaysThisTitle, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(showMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(728, Short.MAX_VALUE))
            .addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(panelA, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(sttingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(home, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))        );
        interfaces.add(sttings, "card2");
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 1206, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(menu, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGap(0, 911, Short.MAX_VALUE)))
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(interfaces, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 808, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(menu, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(interfaces, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))        );
        menu.getAccessibleContext().setAccessibleDescription("");        pack();    }
         /////////// END OF THE INIT OF THE COMPONENTS   /////// THIS CODE IS GENERATED BY THE IDE/ / // ///////////////
    /// HERE IS MY CODE:
    private void hideMenuMouseClicked(java.awt.event.MouseEvent evt) {                                      
        System.out.println("Closing Menu");
        if (menu.getWidth() > 0) {
            menu.setFocusable(true);
            Thread th = new Thread(){
                public void run () {
                    try {
                    for (double i = menu.getMaximumSize().width; i > -1; i=i-1.5) {
                        Thread.sleep(1);
                        menu.setSize((int) i, menu.getHeight());   } /*LOOP END*/
                    } catch (Exception e) {JOptionPane.showMessageDialog(null, e);  }   }    };
            th.start();        }    }                                    
            
    private void goToAMouseClicked(java.awt.event.MouseEvent evt) {                                   
        panelA.setVisible(true);
        keepVisibleAlwaysThisTitle.setText("   PANEL A");
        hideMenuMouseClicked(evt);
    }                                  

    private void showMenuActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if (menu.getWidth() == 0) {
            menu.setSize(0, menu.getHeight());
            Thread th = new Thread(){
                public void run () {
                    try {for (double i = 0; i < menu.getMaximumSize().width + 1; i=i+1.5) {
                            Thread.sleep(1);
                            menu.setSize((int) i, menu.getHeight());   } /*LOOP END*/
                    } catch (Exception e) {JOptionPane.showMessageDialog(null, e);    }   }     };
                    th.start();
                    menu.setSize(menu.getMaximumSize().width, menu.getHeight());
                    menu.setFocusable(true);    }    }                                        

    private void clearesActionPerformed(java.awt.event.ActionEvent evt) {                                        
        textArea.setText("");    }                                       
        
    private void writesActionPerformed(java.awt.event.ActionEvent evt) {                                       
        textArea.setText("PANEL A IS ONE OF THE DIFFERENT PANELS THAT THE APP WILL HAVE, AND THE USER WILL ACCESS TO THOSE VIA THE MENU");    }                                      
                            
    private void goToA1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
        panelA.setVisible(false);
        home.setVisible(true);
        keepVisibleAlwaysThisTitle.setText("You are now in home");    }   
    /////////////////// THIS IS THE MAIN CLASS ///////////// THIS CODE IS GENERATED BY THE IDE/ / // //////////////////
    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;        }     }     } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(mreForStackOverflow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new mreForStackOverflow().setVisible(true);            }        });    }
    public javax.swing.JButton hideMenu;
    private javax.swing.JPanel interfaces;
    private javax.swing.JPanel sttings;
    private javax.swing.JButton cleares;
    private javax.swing.JButton goToA;
    private javax.swing.JButton goToA1;
    private javax.swing.JPanel home;
    private javax.swing.JLabel keepVisibleAlwaysThisTitle;
    private javax.swing.JPanel menu;
    private javax.swing.JPanel panelA;
    private javax.swing.JButton showMenu;
    private javax.swing.JTextArea textArea;
    private javax.swing.JButton writes;}

据我所知,我确信你可以复制并编译这段代码,希望你能重现我所描述的问题


共 (1) 个答案

  1. # 1 楼答案

    好吧,仍然不是MRE,因为:

    1. 由于类名不正确,代码甚至无法编译。类名应以大写字符开头。为什么我要不断提到这样的小细节???你会得到一个免费答案,但如果你在发布代码时不能遵循Java惯例,就不会有更多答案
    2. 还有很多代码与问题没有直接关系。你的问题是把菜单放在按钮上方

    所以你只需要:

    1. 你只需要一个带有“显示菜单”的框架
    2. 然后在菜单上你需要一个“隐藏菜单”按钮

    所有其他组件都与您描述的问题无关

    我能解决一些问题,但不是所有问题

    there is a jButton or a jLabel, these just overlay the content of the menu, they keep visible, and they came in front covering the menu's content.

    鼠标事件被传递给添加了鼠标侦听器的组件。当菜单可见时,当鼠标移动到菜单下的按钮上时,您在菜单上移动鼠标,该按钮会被绘制,因为该按钮添加了鼠标侦听器来处理按钮的滚动效果

    在大多数情况下,我可以通过在面板上添加一个假鼠标听筒来防止这种情况:

    menu.addMouseListener( new MouseAdapter() {});
    menu.addMouseMotionListener( new MouseMotionAdapter() {});
    

    但是,当您单击“显示菜单”按钮,然后移动鼠标时,仍然会出现问题。不知道为什么

    the menu pops up inmediatly when a button is pressed in some panel or if the user resizes the windows

    你的逻辑只会操纵setSize(…)方法来隐藏/显示它

    但是,当调整框架大小时,将调用布局管理器,该管理器将根据菜单的首选大小重置菜单的大小(),并重新绘制菜单

    我使用的解决方案是添加:

    menu.setVisible(false);
    

    在“隐藏菜单”逻辑中添加

    menu.setVisible(true)
    

    在“显示菜单”逻辑中

    我从未使用过群组布局。我也不使用布局管理器来显示三维组件,所以我不确定使用GroupLayout是否是解决此类问题的最佳方案

    也许相反,菜单应该是框架的Glass Pane,您可以在需要时显示/隐藏该框架

    或者你应该使用JLayeredPane

    以上两种设计都可以更好地在层中显示组件

    阅读Swing Tutorial了解更多信息。特别是关于:

    1. 如何使用根窗格
    2. 如何使用分层窗格