簡體   English   中英

在擴展Button的類中定義和ActionListener

[英]Define and ActionListener in class which extends Button

如何將Action Listener直接放置在擴展Button的類的定義中?

如果創建了Button類的對象,那么我們可以簡單地使用匿名內部類:

b = new Button("Click me");
b.addActionListener(
                    new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            System.out.println("stringToPrint");
                        }
                    }
                );

how to do the same in below :
class CustomizedButton extends Button{
   String customClass;

   Button(String stringToPrint){
      super(customClass); //customClass is also button name
      this customString = stringToPrint;
   }

   /*this.addActionListener( //don't work this way
       new ActionListener(){
            public void actionPerformed(ActionEvent e){
                System.out.println(customClass);//use outer(?) field
            }
        }
     );*/
}

我需要創建20個幾乎相同但略有不同的按鈕,所以匿名內部太長了

您可以聲明一個私有嵌套類,如下所示:

public class CustomizedButton extends Button{
    String customClass;

    CustomizedButton(String stringToPrint){
        super(customClass); //customClass is also button name
        this.customString = stringToPrint;
        addActionListener(new MyListener());
    }

    private class MyListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO: listener code here
        }
    }
}

但這與使用匿名內部類或lambda並沒有太大區別:

public class CustomizedButton extends Button{
    String customClass;

    CustomizedButton(String stringToPrint){
        super(customClass); //customClass is also button name
        this.customString = stringToPrint;
        addActionListener(e -> myListenerCode(e));
    }

    private void myListenerCode(ActionEvent e) {
        // TODO: listener code here
    }

}

說了這么多,我想到了其他問題:

  • 通常,最好是繼承優先於合成。 我敢打賭,您真正想要的是某種工廠方法,可以創建帶有偵聽器的按鈕
  • 如果過期20年以上,為什么還要使用java.awt.Button類之類的AWT組件? 為什么不擺JButton呢?
  • 如果使用的是Swing JButton,最好是創建一個自定義Action而不是擴展JButton。 動作可以保留和更改許多按鈕屬性,包括偵聽器,顯示的文本,圖標,工具提示文本(懸停顯示)...。
  • 因此,如果這是一個新項目,則應首選JavaFX,因為這是當前受支持程度最高的Java GUI庫。

例如,AbstractAction類可能類似於:

public class CustomizedAction extends AbstractAction{
    String text;

    CustomizedAction(String text, int mnemonic){
        super(text); //text is also button name
        this.text = text;
        putValue(MNEMONIC_KEY, mnemonic); // for alt-key short cut if desired
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String currentName = getValue(NAME); // same value as the text field
        System.out.println(currentName);

        // TODO: more listener code here
    }

}

可以這樣使用:

JButton button = new JButton(new CustomizedAction("Foo", KeyEvent.VK_F));

暫無
暫無

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

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