簡體   English   中英

swing-在JPanel上單擊獲取組件

[英]swing - get component clicked on JPanel

確定,所以我有一個帶有GridLayout的JPanel。 然后,網格的每個單元格都包含另一個JPanel。

我想做的是在“下方” JPanel上有一個偵聽器,然后告訴我單擊了“疊加” JPanel中的哪個-這樣我就可以對它和周圍的JPanels做出反應,而無需覆蓋JPanels知道他們的位置(他們改變了!)

有沒有一種方法-與在MouseListener中確定單擊的JPanel組件類似 事件處理,但是我找不到在最上面抓住組件的方法。

我可能會抓住這些共同的牧師,並使用該信息來解決它-但我寧願不要!

任何幫助/指針/提示將不勝感激:D

做同樣的事情,但是在源代碼上使用getParent() 或者,您可以搜索層次結構是否更深,甚至可以找到一些幫助方法: javax.swing.SwingUtilities.getAncestorOfClassgetAncestorNamed

使用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();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM