gpt4 book ai didi

java - 在扩展 Button 的类中定义和 ActionListener

转载 作者:行者123 更新时间:2023-12-02 02:07:10 26 4
gpt4 key购买 nike

如何将 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 个几乎相同但略有不同的按钮,因此匿名内部太长

最佳答案

您可以声明一个私有(private)嵌套类,如下所示:

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
}

}

话虽如此,我想到了其他问题:

  • 通常最好选择组合而不是继承。我敢打赌,您真正想要的是某种工厂方法,它可以创建带有监听器的按钮
  • 为什么还要使用 AWT 组件(例如 java.awt.Button 类),因为它已经过时了 20 多年?为什么不使用 Swing JButtons 来代替呢?
  • 如果您使用 Swing JButton,最好是创建自定义操作而不是扩展 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));

关于java - 在扩展 Button 的类中定义和 ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50609347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com