Есть ли способ узнать, какая панель JPanel нажата?

Я пытаюсь распечатать, какой JPanel в массиве JPanel был нажат с помощью mouseEvent. Как я могу это сделать?

Это дает мне ошибку:

Local variable i defined in an enclosing scope must be final or effectively final

for(int i=0; i<count[0]; i++) {
    p1[i] = new JPanel();
    l1[lcount] = new JLabel("Panel "+(i+1));
    p1[i].add(l1[lcount]);
    panel_2.add(p1[i]);
    lcount++;
    p1[i].addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            System.out.println(i);
        }
    });
}

Я хочу извлечь значение i и отобразить его в другом JLabel.


person valar_007    schedule 02.05.2019    source источник
comment
Похоже на дубликат из этот вопрос, и ответ тот же. И если вы сделали найдите в Google полученную ошибку, которую вы получите на странице этот вопрос и ответ, в котором прямо говорится, почему вы получаете эту ошибку.   -  person Frakcool    schedule 02.05.2019
comment
Возможный дубликат Передача переменных в ActionListener в Java   -  person Frakcool    schedule 02.05.2019
comment
Также возможен дубликат stackoverflow.com/questions/39483665/   -  person Frakcool    schedule 02.05.2019


Ответы (1)


Вы можете использовать e.getSource () из mouseEvent (). Просто передайте его в JPanel.

Вот пример.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MouseEventSource {
   JFrame frame = new JFrame();

   public static void main(String[] args) {
      new MouseEventSource().start();
   }

   public void start() {
      JPanel p1 = createPanel("Panel 1", Color.BLUE);
      JPanel p2 = createPanel("Panel 2", Color.RED);
      MyMouseListener ml = new MyMouseListener();
      p1.addMouseListener(ml);
      p2.addMouseListener(ml);
      frame.setLayout(new FlowLayout());
      frame.add(p1);
      frame.add(p2);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }

   public JPanel createPanel(String name, Color color) {
      JPanel panel = new JPanel() {
         public String toString() {
            return name;
         }
      };
      panel.setBackground(color);
      panel.setPreferredSize(new Dimension(250, 250));
      return panel;
   }

   private class MyMouseListener extends MouseAdapter {
      public void mouseClicked(MouseEvent e) {
         // not really necessary to print toString()
         JPanel panel = (JPanel) e.getSource();
         System.out.println(panel);
      }
   }
}
person WJS    schedule 02.05.2019