簡體   English   中英

如何獲得從網格單擊的組件?

[英]How can I get the component I clicked on from a grid?

我正在顯示一個對象網格,我想打印單擊的對象的名稱。 但是,下面的代碼僅在我單擊最左上角的方塊時才會注冊一次單擊,然后每張卡都會打印其名稱。

知道我需要做些什么嗎?

public class GHand extends JPanel {

    GCard[] grid; //names the grid of buttons

    public GHand(int width, int height, Hand hand) { //constructor
        this.setLayout(new GridLayout(width, 4));
        grid = new GCard[hand.size()]; //allocate the size of grid
        for (int i = 0; i < grid.length; i++) {
            grid[i] = new GCard(hand.getCard(i)); //creates new card
            this.add(grid[i]); //adds card to grid
        }

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);
                for (GCard g : grid) {

                    if (g.contains(me.getPoint())) {//check if mouse is clicked within card

                        System.out.println("Clicked a " + g.getCardName());

                    }
                }
            }
        });
    }
}

我想向網格中的每個對象添加偵聽器會很浪費,對嗎? 最佳做法是什么?

我認為您在正確的道路上...

我認為您不應該使用MouseEvent,因為它會跟蹤鼠標的運動和單擊,因此您必須跟蹤網格項的確切位置。 您可能想要這樣做,但是您必須創建更多代碼才能解決網格項的位置,而這將涉及與GUI關聯的許多復雜代碼。

我的意見是,您應該使用ActionEvent Listener,這樣當您單擊對象(我假設是JPanel或Button對象)時,您可以響應發生的單擊。 通過.getCommand()方法。

您將必須更改GHand對象或GCard對象(取決於您要在網格上顯示的內容),以包括可用於區分不同對象的名稱變量。 (這可以像確定對象ID的單一計數器方法一樣簡單),也可以將其保留為名稱變量。 您將必須重寫.toString()方法(在GHand / GCard對象內部),以便允許.getCommand()方法以讀者友好的響應進行響應,以便您可以根據單擊的內容來定向程序流。


這對添加偵聽器應該不會造成浪費,因為您應該已經將其添加到單個對象類中。 我假設您使用的是網格以允許用戶單擊對象(我不知道是使用多個GCard的多個GHands還是僅將多個GCard的一個GHand顯示在屏幕上)。 因此,您可以創建簡單的對象並將其分布在網格上,您可以在其中單擊網格對象,並且該網格對象應響應單擊,因此可以獲取您的方法,然后調用它。

希望這可以幫助!

暫無
暫無

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

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