提问者:小点点

关于如何实现Swing监听器的一些问题


我对将ActionListener的这种配置与一个简单的JavaSwing示例应用程序相关有些怀疑。

通常,我总是将侦听器声明为实现ActionListener接口的私有内部类,但此示例(在Web上找到)的工作方式不同:

package com.andrea.second;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;


/* SimpleMeni it is a JFrame: a container */
public class SimpleMenu extends JFrame {

    public SimpleMenu() {
        initUI();
    }

    public final void initUI() {

        JMenuBar menubar = new JMenuBar();          // The menu bar containing the main menu voices

        ImageIcon icon = new ImageIcon(getClass().getResource("exit.png"));     

        // Creo 2 menu a tendina:
        JMenu file = new JMenu("File"); 
        JMenu bla = new JMenu("Bla");

        // Lega l'attivazione del menu allo shortcut ALT+F sulla tastiera:
        file.setMnemonic(KeyEvent.VK_F);

        JMenuItem eMenuItem = new JMenuItem("Exit", icon);      // Etichetta Exit con icona 
        eMenuItem.setMnemonic(KeyEvent.VK_E);
        // Setta un messaggio testuale tooltip al passaggio del mouse sulla voce di menu:
        eMenuItem.setToolTipText("Exit application");   

        // Setto un listener con relativa azione definita dal metodo actionPerformed() della classe che implementa ActionListener:
        eMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });

        file.add(eMenuItem);


        menubar.add(file);
        menubar.add(bla);

        setJMenuBar(menubar);

        setTitle("Simple menu");
        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                SimpleMenu ex = new SimpleMenu();
                ex.setVisible(true);
            }
        });
    }
}

如您所见,此示例不要通过实现ActionListener接口的私有内部类声明侦听器,而是执行类似的操作:

    eMenuItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    }); 

其中eMenuItem是我要处理单击事件的项目。

这段代码到底是什么意思:

(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    }); 

我认为它正在创建一个类,它是ActionListener(实现ActionListener接口),同时他实现了它(实现actionPerform()方法)

但是我不确定,因为我不知道这种编程风格。

我的推理正确吗?你能给我更准确的信息吗?


共1个答案

匿名用户

您引用的代码正在创建一个匿名类。

它与您一直在使用的内部类非常相似,只是没有定义的名称。这意味着它不能在其他地方重新实例化/重用,但因为它的工作只是处理一种类型的事件,这并不是真正的问题。