好的,所以我有一个带有GridLayout的JPanel。然后网格的每个单元格包含另一个JPanel。
我希望能够做到的是在“底层”JPanel上有一个监听器,然后告诉我哪个“叠加”的JPanels被点击了 - 所以我可以对它和周围的那些做出反应,而不做覆盖JPanels知道他们的位置(他们改变!!)
有没有办法做到这一点 - 类似于Determine clicked JPanel component in the MouseListener. Event handling,但我找不到抓住顶部组件的方法。
我可能会抓住合作伙伴并使用该信息进行解决 - 但我不愿意!
任何帮助/指针/提示将不胜感激:D
答案 0 :(得分:3)
做同样的事情,但在源上使用getParent()
。或者,如果更深层次,您可以搜索层次结构,甚至是一些辅助方法:
javax.swing.SwingUtilities.getAncestorOfClass
和getAncestorNamed
答案 1 :(得分: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();
}
});
}
}