簡體   English   中英

在JButton對象上使用嵌套的ActionListener類會出錯嗎?

[英]Getting error using nested ActionListener class for a JButton Object?

這是我第一次嘗試使用動作偵聽器和事件處理。 我正在嘗試創建一個具有3個按鈕的簡單GUI: homeabouttag 我為每個JButton添加了一個偵聽器對象,並為該偵聽器對象創建了一個嵌套類。

public class interfacetest {

    public static void main(String[] args) {

        JFrame window = new JFrame("GUI Test");
        window.setSize(250, 100);
        window.setLocation(100, 100);

        final JButton home = new JButton("Home");
        final JButton about = new JButton("About");
        final JButton tag = new JButton("Tag");

        JMenuBar menu = new JMenuBar();
        menu.add(home);
        menu.add(about);
        menu.add(tag);
        menu.setVisible(true);
        window.setJMenuBar(menu);

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        thehandler handler = new thehandler();
        home.addActionListener(handler);
        about.addActionListener(handler);
        tag.addActionListener(handler);

        window.setVisible(true);
    }

    // Here is my nested class.

    private class thehandler implements ActionListener {

        public void actionPerformed(ActionEvent event) {

            String string = "";
            if (event.getSource()==home)
                string = string.format("home: %s, event.getActionCommand()");
            else if (event.getSource()==about)
                string = string.format("about: %s, event.getActionCommand()");
            else if (event.getSource()==tag) string = string.format("tag: %s, event.getActionCommand()");
            JOptionPane.showMessageDialog(null, string);
        }
    }
}

創建新的thehandler對象時出現錯誤: “沒有接口test類型的封閉實例可以訪問。必須使用接口test類型的封閉實例(egxnew A()來限定分配,其中x是interfacetest的實例)“。

您有兩種簡單的方法可以解決此問題:

  1. 將您的嵌套類設為靜態: private static class thehandler
  2. 創建一個封閉類的實例: (new interfacetest()).new thehandler() (您可能需要重組代碼,並且可能希望保留對interfacetest實例的引用。

像這樣:

interfacetest iner = new interfacetest();
// Do things...
thehandler handler = iner.new thehandler(); // (e.g. x.new A() where x is an instance of interfacetest.)

說明:您的嵌套類是非靜態的,但是您嘗試像訪問它一樣訪問它。

  • 如果類的成員不是靜態的,則必須通過該類的實例classInstance.nonStaticMember (上面的選項2)來訪問它。
  • 如果類的成員是靜態的,則可以通過任何一種方式訪問​​它,但是正確的方法是通過類類型: ClassType.staticMember (上面的選項1)。

在您的情況下,您正在執行ClassType.nonStaticMemberthis.nonStaticMember之類的操作(“無法訪問類型為this.nonStaticMember封閉實例”)。

您可能還會發現此術語(來自教程 )很有用:

嵌套類分為兩類:靜態和非靜態。 聲明為靜態的嵌套類稱為靜態嵌套類 非靜態嵌套類稱為內部類

筆記:

  • JFrame上調用pack() ,而不是手動setSize(...)
  • 僅在對布局進行了所有更改之后,才調用setVisible(true)
  • 當您的按鈕執行不同的操作時,為每個按鈕創建一個動作偵聽器(這更有意義)。
  • 如果您的按鈕執行類似的操作,例如僅使用不同的顏色創建相同的面板,則使用具有顏色的構造函數創建單個動作偵聽器(為其創建字段),然后將其應用於actionPerformed
  • 類名以Java的命名約定中的大寫字母開頭。

暫無
暫無

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

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