簡體   English   中英

如何確定哪個面板上有按下的按鈕-應用程序窗口

[英]How to determine which panel holds a button that was pressed - Application Window

我在20x20的JPanel中有一個Tile對象數組(Panel,Button到tile)。 如果單擊按鈕1,則發生事情,按下按鈕2,則發生事情,等等。

我希望每次單擊除第一行中的一個按鈕以外的其他按鈕時都發生特定功能(所有按鈕的第一行均已分配功能,其他380個按鈕均未分配功能)。

所以在頂部按鈕的情況下,我有代碼:

if(e.getSource() == tiles[0][0].button)
    {
    //do stuff
    }
else if(e.getSource() == tiles[0][1].button)
    {
    //do stuff
    }

對於其他按鈕,我想要一些類似的東西:

JButton button;
button = e.getSource();
JPanel hostPanel = button.PanelInWhichButtonisContained();

但我不確定要完成該任務的語法或種類。 我真的沒有任何代碼可以呈現先前的嘗試,因為我不確定如何完成此任務,但是我無法在萬維網上找到任何東西來幫助我完成此任務。

我目前僅使用默認的應用程序窗口庫和類(javax.swing,java.awt等),但是我完全願意下載外部庫。

確定actionPerformed方法中像按鈕按下之類的動作的“來源”通常很困難(幸運的是,幾乎沒有必要)。

這意味着這是高度可疑的:

class ButtonListener implements ActionListener {
    @Override 
    public void actionPerformed(ActionEvent e) {
        // DON'T DO THIS!
        if (e.getSource() == someButton) doThis();
        if (e.getSource() == someOtherButton) doThad();
    }
}

您通常應該這樣做。

當然,添加強制轉換並逐步執行一些容器層次結構甚至更糟:

// DON'T DO THIS!
Object source = e.getSource();
Component button = (Component)source;
Component parent = button.getParent();
if (parent == somePanel) doThis();
if (parent == someOtherPanel) doThat();

在基本上所有情況下,將監聽器附加到特定於該按鈕的按鈕上都更加靈活和優雅,這意味着它知道該按鈕應該做什么。

對於單個按鈕,可以使用匿名內部類以老式方式解決:

class Gui {

    void create() {
        JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {
            @Override 
            public void actionPerformed(ActionEvent e) {
                startSomething();
            }
        });
    }

    private void startSomething() { ... }
}

使用Java 8的lambda表達式可以更簡潔地編寫相同的代碼:

class Gui {

    void create() {
        JButton startButton = new JButton("Start");
        startButton.addActionListener(e -> startSomething());
    }

    private void startSomething() { ... }
}

(旁注:我認為,無論如何,僅在ActionListener實現中僅調用一個方法是一種好習慣actionPerformed方法不應包含很多代碼行,尤其是不應包含“業務邏輯”。 按鈕的作用 -例如, startSomething例所示,為startSomething


對於數組中包含的按鈕,如您的問題示例中所示,有一個巧妙的技巧可以保留有關被單擊按鈕的信息:

class Gui {

    JButton buttons[];

    void create() {

        buttons = new JButton[5];
        for (int i=0; j<buttons.length; i++) { 
            int index = i;
            buttons[i] = new JButton("Button " + i);
            buttons[i].addActionListener(e -> clickedButton(index));
        }
    }

    private void clickedButton(int index) { 
        System.out.println("Clicked button at index " + index);
    }
}

在許多情況下,您甚至不必再保留JButton buttons[]數組。 通常,您可以只創建按鈕,將它們添加到某個面板,然后只對傳遞給clickedButton方法的index感興趣。 (盡管在某些情況下, button[]數組可能是必需的,例如,如果您想在單擊按鈕后更改其標簽,則可以使用)。

暫無
暫無

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

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