2

好的,所以我有一个带有 GridLayout 的 JPanel。然后网格的每个单元格都包含另一个 JPanel。

我想做的是在“下方”JPanel 上有一个侦听器,然后告诉我点击了哪个“覆盖”的 JPanel - 这样我就可以对它和周围的 JPanel 做出反应,而无需制作覆盖 JPanel意识到他们的立场(他们改变了!!)

有没有办法做到这一点 - 类似于在 MouseListener 中确定单击的 JPanel 组件。事件处理,但我找不到在顶部抓取组件的方法。

我可能可以抓住坐标并使用该信息来解决 - 但我宁愿不!

任何帮助/指针/提示将不胜感激:D

4

2 回答 2

3

做同样的事情,但getParent()在源上使用。或者,如果层次结构更深,您可以搜索层次结构,甚至可以使用一些辅助方法: javax.swing.SwingUtilities.getAncestorOfClassgetAncestorNamed

于 2012-05-06T16:49:00.810 回答
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();
            }
        });
    }
}
于 2012-05-06T17:33:43.350 回答