2

OK、GridLayoutを備えたJPanelがあります。グリッドの各セルには、別のJPanelが含まれます。

私がやりたいのは、「下の」JPanelにリスナーを配置して、「オーバーレイされた」JPanelのどれがクリックされたかを教えてくれることです。これにより、カバーするJPanelを作成せずに、JPanelとその周囲のJPanelに反応できます。彼らの位置を知っている(彼らは変わる!!)

これを行う方法はありますか?MouseListenerでクリックされたJPanelコンポーネントを判別するのと同様です。イベント処理はできましたが、コンポーネントを一番上に配置する方法が見つかりませんでした。

私はおそらく共同組織をつかんで、その情報を使用してそれを解決することができました-しかし、私はむしろしたくありません!!

ヘルプ/ポインタ/ヒントをいただければ幸いです:D

4

2 に答える 2

3

同じことを行いますgetParent()が、ソースで使用します。javax.swing.SwingUtilities.getAncestorOfClassまたは、階層がより深い場合は、そのためのいくつかのヘルパーメソッドでさえ、階層を検索できます。 getAncestorNamed

于 2012-05-06T16:49:00.810 に答える
3

putClientProperty/を使用getClientPropertyします。最も単純なものはありません...、1つのオブジェクトに無限の数の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 に答える