mouseListener 只识别 JLabel

mouseListener only recognize JLabel

我在包含多个组件的 JPanel 上添加了一个 mouseListener。 为了测试 mouseListener,我只在进入和退出 jpanel 时设置了 Jpanel 的边框。 问题是,它只识别 jpanel 的 jlabels 上的鼠标事件,而不识别其他组件或主 jpanel 本身的鼠标事件。想不通为什么...

代码如下:

     import javax.swing.JFrame;


public class compte2 extends javax.swing.JPanel {


    public compte2() {
        initComponents();
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();

        setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        setPreferredSize(new java.awt.Dimension(240, 160));
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                formMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                formMouseExited(evt);
            }
        });
        setLayout(new java.awt.BorderLayout());

        jPanel1.setMinimumSize(new java.awt.Dimension(100, 56));
        jPanel1.setPreferredSize(new java.awt.Dimension(400, 56));
        jPanel1.setLayout(new java.awt.BorderLayout());

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("CLUB");
        jLabel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jLabel1.setPreferredSize(new java.awt.Dimension(240, 28));
        jPanel1.add(jLabel1, java.awt.BorderLayout.PAGE_START);

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel3.setText("ILLIMITE");
        jLabel3.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jLabel3.setPreferredSize(new java.awt.Dimension(190, 28));
        jPanel1.add(jLabel3, java.awt.BorderLayout.CENTER);

        jButton2.setIcon(new javax.swing.ImageIcon("C:\Users\pc\Downloads\icon\Pics\see.png")); // NOI18N
        jButton2.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton2.setMinimumSize(new java.awt.Dimension(28, 28));
        jButton2.setPreferredSize(new java.awt.Dimension(28, 28));
        jPanel1.add(jButton2, java.awt.BorderLayout.LINE_END);

        add(jPanel1, java.awt.BorderLayout.PAGE_START);

        jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel2.setMinimumSize(new java.awt.Dimension(100, 28));
        jPanel2.setPreferredSize(new java.awt.Dimension(400, 28));
        jPanel2.setLayout(new java.awt.BorderLayout());

        jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel4.setText("€");
        jLabel4.setPreferredSize(new java.awt.Dimension(15, 28));
        jPanel2.add(jLabel4, java.awt.BorderLayout.LINE_END);

        jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel6.setText("0,00");
        jLabel6.setMaximumSize(new java.awt.Dimension(50, 28));
        jLabel6.setPreferredSize(new java.awt.Dimension(50, 28));
        jPanel2.add(jLabel6, java.awt.BorderLayout.CENTER);

        jButton1.setText("ENCAISSER");
        jButton1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton1.setMinimumSize(new java.awt.Dimension(80, 28));
        jButton1.setPreferredSize(new java.awt.Dimension(80, 28));
        jPanel2.add(jButton1, java.awt.BorderLayout.LINE_START);

        add(jPanel2, java.awt.BorderLayout.PAGE_END);
        add(jScrollPane1, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                        

    private void formMouseEntered(java.awt.event.MouseEvent evt) {                                  
        compte2 mc = (compte2)evt.getSource();
    mc.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 0, 0), 4));
    }                                 

    private void formMouseExited(java.awt.event.MouseEvent evt) {                                 
       compte2 mc = (compte2)evt.getSource();
    mc.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
    }                                


    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration                   



    public static void main(String[] args) {

        JFrame j = new JFrame();
        compte2 mc = new compte2();
        j.add(mc);
        j.pack();
        j.setVisible(true);
}

}

您的问题是您将子面板添加到主面板,您的事件没有按照您的预期生成。

向您的 mouseEntered/Exited 方法添加一些调试代码,以便您可以查看事件何时生成。

更改您的代码,为您的面板设置背景颜色,以便您可以在鼠标 enters/exits 面板时看到:

initComponents();
addMouseListener(this);
setBackground(Color.YELLOW);

我从不使用 IDE 生成代码,我不知道 GroupLayout 在做什么。所以你会得到奇怪的行为,因为子组件之间存在间隙。因此,当您在面板之间垂直移动鼠标时,您会看到变化。

按钮和标签已添加到子组件,因此如果您将鼠标水平放置在子面板上,它们不应生成事件。