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

Buttons and Labels cames over the Menu's JPanel

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

隐藏和显示菜单的照片:

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

这里的问题:

我尝试通过 hiddenhidden 来修复它,使用方法 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

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

那我做错了什么?如何才能做到这一点? 谢谢。

“编辑后:” 我在这里合并了一些可以显示问题的代码。是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(mreForWhosebug.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(mreForWhosebug.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(mreForWhosebug.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(mreForWhosebug.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new mreForWhosebug().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;}

据我所知,我相当确定您可以复制此代码并进行编译,希望您能够重现我所描述的问题。

嗯,仍然不是 MRE,因为:

  1. 代码甚至无法编译,因为 class 名称不正确。 Class 名称应以大写字符开头。为什么我要一直提这样的小细节???您将获得一个免费答案,但如果您在发布代码时不能遵循 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.

鼠标事件被传递到添加了 MouseListener 的组件。当菜单可见并且您在菜单周围移动鼠标时,当鼠标在菜单下的按钮上移动时,该按钮被绘制,因为该按钮添加了一个鼠标侦听器来处理按钮的翻转效果。

在大多数情况下,我可以通过向面板添加一个虚拟的 MouseListener 来防止这种情况发生:

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(...) 方法 hide/show 它。

然而,当调整框架大小时,将调用布局管理器,这将根据其首选大小重置菜单的 size() 并重新绘制菜单。

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

menu.setVisible(false);

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

menu.setVisible(true)

在“显示菜单”逻辑中。

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

也许菜单应该是 Glass Pane 的框架,您可以 show/hide 是必需的。

或者您应该使用 JLayeredPane。

以上两个都更好地设计为分层显示组件。

阅读 Swing Tutorial 了解更多信息。特别是以下部分:

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