簡體   English   中英

從嵌套的 Java ActionListener 內部調用它

[英]Calling this from inside a nested Java ActionListener

假設我有這個:

class external {
    JFrame myFrame;
    ...

    class internal implements ActionListener {
        public void actionPerformed(ActionEvent e) {
             ...
             myFrame.setContentPane(this.createContentPane());
        }
    }
    ...
}

createContentPane返回一個容器。 現在,如果我在ActionListener之外執行此代碼,它會起作用,因為我可以訪問它。 但是,在里面,我沒有。 我可以訪問myFrame ,這將使用方法的內容進行更新,但這還不足以做我想做的事,除非我能從中得到這個。

我還需要來自其他實例變量的信息才能使用createContentPane() ,所以我不確定我是否可以使它成為static

您可以:

myFrame.setContentPane(createContentPane());

或者

myFrame.setContentPane(external.this.createContentPane());

順便說一句,在 Java 類中,第一個字母通常是大寫的。 如果您不這樣命名,您的代碼仍然可以編譯和運行,但是通過遵循編碼約定,您將能夠閱讀其他代碼,更重要的是其他人將能夠閱讀您的代碼。

所以這將是一個更好的風格:

class External {
    JFrame myFrame;
    ...

        class Internal implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                ...
                myFrame.setContentPane(createContentPane());
               //Or myFrame.setContentPane(External.this.createContentPane());
            }
        }
    ...
 }

Java 代碼約定

external.this將使您能夠訪問封閉 class 的實例,如果這是您想要的...

不確定您到底在做什么,但內部 class 可以訪問其封閉 class 的所有成員。 要訪問封閉 class 的“this”指針(例如,傳遞給其他方法),請使用:

someMethod(External.this);

在您的示例中,您實際上是通過使用“this”使其復雜化。 以下是兩個可行的選項:

myFrame.setContentPane(createContentPane());

或者:

myFrame.setContentPane(External.this.createContentPane());

請注意,您已經在以相同的方式訪問 myFrame。

首先,您必須像這樣在外部 class 中擴展 JFrame

class External extends JFrame {
.....
.....
}

暫無
暫無

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

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