Определите, как щелкнуть компонент JPanel в MouseListener. Обработка событий

У меня есть class, который расширяет JPanel:

public class ButtonPanel extends JPanel { private label; public ButtonPanel() { label=new JLabel("waiting for click"); add(label); } public void setButtonText() { label.setText("just clicked"); } } 

У меня есть несколько экземпляров этого classа, который добавляется в JFrame. Я хочу создать один экземпляр classа MouseAdapter, а затем добавить их как прослушиватель мыши ко всем компонентам ButtonPanel на моем JFrame. I meen:

 ButtonPanel butt1 = new ButtonPanel(); ButtonPanel butt2 = new ButtonPanel(); ButtonPanel butt3 = new ButtonPanel(); //... here goes code which add ButtonPanels to JFrame MouseAdapterMod mam = new MouseAdapterMod(); butt1.addMouseListener(mam); butt2.addMouseListener(mam); butt3.addMouseListener(mam); 

Класс MouseAdapterMod Я хочу быть отдельным от другого и найти в нем собственный пакет. Он должен выглядеть так:

 public class MouseAdapterMod extends MouseAdapter { public void mouseClicked(MouseEvent e) { //here goes the code of calling setButtonText method of ButtonPanel component on which the event had occurred } } 

Таким образом, проблема в том, что я не знаю, как реализовать метод mouseClicked, чтобы определить, какой из ButtonPanel генерирует событие и вызывает соответствующий ему метод setButtonText (). Кто-нибудь знает, как это сделать?

Я знаю, что могу добиться этого, включив функции обработки событий в class ButtonPanel, но это не подходит для меня, потому что я хочу сохранить структуру classа, как я описал выше, и иметь только один экземпляр classа MouseAdapterMod для обработки всех ButtonPanels.

Метод MouseEvent#getSource вернет, какой объект был нажат:

 public class MouseAdapterMod extends MouseAdapter { // usually better off with mousePressed rather than clicked public void mousePressed(MouseEvent e) { ButtonPanel btnPanel = (ButtonPanel)e.getSource(); btnPanel.setButtonText(); } } 

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

Моя тестовая программа:

 import java.awt.Color; import java.awt.GridLayout; import java.awt.event.*; import javax.swing.*; public class MainForButtonPanel extends JPanel { public MainForButtonPanel() { setLayout(new GridLayout(4, 4)); MouseAdapter myMA = new MouseAdapterMod(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { ButtonPanel btnPanel = new ButtonPanel(); btnPanel.addMouseListener(myMA); add(btnPanel); } } } private static void createAndShowUI() { JFrame frame = new JFrame("MainForButtonPanel"); frame.getContentPane().add(new MainForButtonPanel()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } } class ButtonPanel extends JPanel { private static final int TIMER_DELAY = 2000; private static final String JUST_CLICKED = "just clicked"; private static final String WAITING_FOR_CLICK = "waiting for click"; private static final Color CLICKED_COLOR = Color.pink; private JLabel label; public ButtonPanel() { label = new JLabel(WAITING_FOR_CLICK); add(label); } public void setButtonText() { label.setText(JUST_CLICKED); setBackground(CLICKED_COLOR); new Timer(TIMER_DELAY, new ActionListener() { public void actionPerformed(ActionEvent ae) { label.setText(WAITING_FOR_CLICK); setBackground(null); ((Timer)ae.getSource()).stop(); } }).start(); } } class MouseAdapterMod extends MouseAdapter { // usually better off with mousePressed rather than clicked public void mousePressed(MouseEvent e) { ButtonPanel btnPanel = (ButtonPanel)e.getSource(); btnPanel.setButtonText(); } } 
  • Как нарисовать изображение над другим изображением?
  • Закройте один JFrame, не закрывая другого?
  • Нарисуйте круг с радиусом и острием по краю
  • paintComponent рисует другие компоненты поверх моего рисунка
  • Попытка создания JTable с правильным заголовком строки
  • Как разрешить ввод только цифр в jTextField?
  • Как вставить изображение в JTable Cell
  • Добавьте JLabel с изображением в JList, чтобы показать все изображения
  • Приложение Swing -> Перетащите на рабочий стол / папку
  • Значок настройки и значения JComboBox
  • Как я могу складывать / накладывать jPanels в Java?
  • Давайте будем гением компьютера.