2012-05-06 3 views
2

ОК, так что у меня есть JPanel с GridLayout. Каждая ячейка сетки затем содержит еще один JPanel.swing - получить компонент, нажатый на JPanel

То, что я хотел бы иметь, - это прослушивать «снизу» JPanel, который затем сообщает мне, какая из наложенных «JPanels» была нажата, чтобы я мог реагировать на нее и окружающие, без сделав покрытие JPanels осведомленным об их положении (они меняются !!)

Есть ли способ сделать это - подобно Determine clicked JPanel component in the MouseListener. Event handling, но я не смог найти способ захвата компонента сверху.

Возможно, я мог бы взять co-oridnates и разобраться с этой информацией - но я бы предпочел не !!

Любые помогают/указатели/советы будут оценены: D

ответ

3

Сделайте то же самое, но использовать getParent() на источник. Или вы можете искать вверх по иерархии, если не глубже, даже некоторые вспомогательные методы для этого: javax.swing.SwingUtilities.getAncestorOfClass и getAncestorNamed

3

использование putClientProperty/getClientProperty, ничего Простейшие вокруг ..., вы можете поместить бесконечное количество ClientProperty к одному объекту

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.LineBorder; 

public class MyGridLayout { 

    public MyGridLayout() { 
     JPanel bPanel = new JPanel(); 
     bPanel.setLayout(new GridLayout(10, 10, 2, 2)); 
     for (int row = 0; row < 10; row++) { 
      for (int col = 0; col < 10; col++) { 
       JPanel b = new JPanel(); 
       System.out.println("(" + row + ", " + col + ")"); 
       b.putClientProperty("column", row); 
       b.putClientProperty("row", col); 
       b.addMouseListener(new MouseAdapter() { 

        @Override 
        public void mouseClicked(MouseEvent e) { 
         JPanel btn = (JPanel) e.getSource(); 
         System.out.println("clicked column " + btn.getClientProperty("column") 
           + ", row " + btn.getClientProperty("row")); 
        } 
       }); 
       b.setBorder(new LineBorder(Color.blue, 1)); 
       bPanel.add(b); 
      } 
     } 
     JFrame frame = new JFrame("PutClientProperty Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(bPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       MyGridLayout myGridLayout = new MyGridLayout(); 
      } 
     }); 
    } 
} 
+0

это замечательно - спасибо :) –

Смежные вопросы