2012-05-06 12 views
2

OKですので、私はGridLayoutを持つJPanelを持っています。グリッドの各セルには別のJPanelが含まれています。swing - コンポーネントをJPanelでクリック

JPanelの「オーバーレイされた」JPanelがクリックされたことを「JPanel」の下にリスナを置いておきたいので、私はそれを周囲のものに反応させることができます。

これは、Determine clicked JPanel component in the MouseListener. Event handlingに似ていますが、上にコンポーネントをつかむ方法を見つけることができませんでした。これは、JPanelsの位置を認識しています。

私はたぶんco-oridnatesをつかんで、その情報を使って作業することができます。

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

答えて

3

同じことを行いますが、ソースにgetParent()を使用しています。それはそのためにも、いくつかのヘルパーメソッド、深いない場合、または階層を検索することができます。最も簡単なの周りに、 javax.swing.SwingUtilities.getAncestorOfClassgetAncestorNamed

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(); 
      } 
     }); 
    } 
} 
+0

これは素晴らしいです - ありがとうございました。 –

関連する問題