Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在扩展按钮的类中定义和操作Listener_Java_Swing - Fatal编程技术网

Java 在扩展按钮的类中定义和操作Listener

Java 在扩展按钮的类中定义和操作Listener,java,swing,Java,Swing,如何将操作侦听器直接放置在扩展按钮的类定义中 如果创建了类按钮的对象,那么我们可以简单地使用一个匿名的内部类: b = new Button("Click me"); b.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ System.

如何将操作侦听器直接放置在扩展
按钮的类定义中

如果创建了类
按钮
的对象,那么我们可以简单地使用一个匿名的内部类:

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
    }

}
说到这里,我想到了其他问题:

  • 通常情况下,最好选择组合而不是继承。我敢打赌,您真正想要的是某种工厂方法,它可以创建带有侦听器的按钮
  • 当java.AWT.Button类过期20年以上时,为什么要使用AWT组件(如java.AWT.Button类)?为什么不改为摆动JButtons呢
  • 如果您使用的是Swing JButton,最好是创建一个自定义操作,而不是扩展JButton。操作可以保存和更改许多按钮属性,包括侦听器、显示的文本、图标、工具提示文本(悬停时显示)
  • 因此,如果这是一个新项目,您应该更喜欢JavaFX,因为这是当前受支持最好的javagui库
例如,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));

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

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
    }

}
说到这里,我想到了其他问题:

  • 通常情况下,最好选择组合而不是继承。我敢打赌,您真正想要的是某种工厂方法,它可以创建带有侦听器的按钮
  • 当java.AWT.Button类过期20年以上时,为什么要使用AWT组件(如java.AWT.Button类)?为什么不改为摆动JButtons呢
  • 如果您使用的是Swing JButton,最好是创建一个自定义操作,而不是扩展JButton。操作可以保存和更改许多按钮属性,包括侦听器、显示的文本、图标、工具提示文本(悬停时显示)
  • 因此,如果这是一个新项目,您应该更喜欢JavaFX,因为这是当前受支持最好的javagui库
例如,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));

为什么不能在创建
b
的类中使用lambda和函数?请详细告诉我们这些按钮的用途。还有,你为什么说一个匿名的内部是“太长”?根据我下面的例子,它可以是一行,将它的大部分功能卸载到一个方法。@Hovercraft充满了EEL它的really about对象继承自JMenuItem并将编辑器中的字体大小设置为给定大小,我询问了Button,因为它更流行的对象让我们用这些信息来回答您的问题,还有更多的信息——细节。请注意,如果您希望JMenuItems和jbutton都共享相同的操作,那么您可以(再次)使用AbstractAction,并使用相同的操作设置菜单项和按钮。这是一种非常灵活和强大的方法。通过这种方式,您还可以启用和禁用类似的菜单项和按钮,因为通过禁用共享操作,这两个组件都将被禁用。为什么不能在创建
b
的类中使用lambda和函数?请详细告诉我们这些按钮的用途。还有,你为什么说一个匿名的内部是“太长”?根据我下面的例子,它可以是一行,将它的大部分功能卸载到一个方法。@Hovercraft充满了EEL它的really about对象继承自JMenuItem并将编辑器中的字体大小设置为给定大小,我询问了Button,因为它更流行的对象让我们用这些信息来回答您的问题,还有更多的信息——细节。请注意,如果您希望JMenuItems和jbutton都共享相同的操作,那么您可以(再次)使用AbstractAction,并使用相同的操作设置菜单项和按钮。这是一种非常灵活和强大的方法。通过这种方式,您还可以启用和禁用类似的菜单项和按钮,因为通过禁用共享操作,两个组件都将被禁用。