MouseListener распознает только JLabel

Я добавил mouseListener в JPanel, который содержит несколько компонентов. Чтобы протестировать mouseListener, я устанавливаю только Border Jpanel при входе и выходе из jpanel. Проблема в том, что он распознает событие мыши только на jlabels jpanel, но не на других компонентах или самой основной 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);
}

}

Разместите правильный минимальный воспроизводимый пример, демонстрирующий проблему. Вы не добавляете панель во фрейм, поэтому мы не можем текстировать код. Вы должны получить событие mouseExited, когда вы наводите указатель мыши на компонент на панели, а затем событие mouseEntered, когда вы покидаете компонент.

camickr 29.10.2018 15:28

Я отредактировал код, чтобы предоставить MCVE

marui 29.10.2018 16:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что вы добавляете дочерние панели к основной панели, когда ваши события генерируются не так, как вы ожидаете.

Добавьте отладочный код в методы mouseEntered / Exited, чтобы вы могли видеть, когда генерируются события.

Измените свой код, чтобы дать панели цвет фона, чтобы вы могли видеть, когда мышь входит / выходит из панели:

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

Я никогда не использую IDE для генерации кода и понятия не имею, что делает GroupLayout. Итак, вы получаете странное поведение, потому что между дочерними компонентами есть промежутки. Таким образом, вы видите изменения, когда перемещаете мышь по вертикали между панелями.

Кнопки и метки добавляются к дочерним компонентам, поэтому они не должны генерировать события, если вы наводите указатель мыши на дочернюю панель горизонтально.

Я переписал фрейм с помощью borderlayout, но проблема та же, mouseListener не распознает jbuttons или JScrollPane. Я попытался добавить mouseListener непосредственно в JscrollPane, но затем я не могу выполнить никаких действий с основным JPanel ...

marui 30.10.2018 12:51

хорошо, я справился с этим, получив родительский элемент jscrollpane и кнопок. Спасибо за вашу помощь!

marui 30.10.2018 13:25

Другие вопросы по теме