java - 如何添加监听器

标签 java swing events awt listener

我几乎很难向我的文本区域添加自定义事件,但几天后我仍然无法处理它!我阅读了很多资源,终于可以编写下面的代码了。

问题

我认为一切都是正确的,但我只是错误地添加了监听器。(也许还有其他问题)。我不知道如何解决它,还是这根本就是问题的原因?

目的

我想让这个工作(用于测试),然后在我的主项目中使用它,所以下面的代码只是为了避免不相关的事情。

场景

我希望按钮触发我的文本区域监听的自定义事件。请考虑(由于我的主要项目设计)我必须在方法中定义和添加文本区域,这是我的问题的主要根源。但不幸的是我无法改变这个决定。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.EventObject;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.EventListenerList;

public class CustomEvent extends JFrame {
    private transient Vector listeners;
    private JPanel contentPane, panel;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    CustomEvent frame = new CustomEvent();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public CustomEvent() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                fireEvent("yes");
            }
        });
        contentPane.add(btnNewButton, BorderLayout.NORTH);
        fillPanel();
        contentPane.add(panel, BorderLayout.CENTER);
    }
    void fillPanel() {
        panel = new JPanel();
        panel.setLayout(new BorderLayout(0, 0));
        final MyTextArea textArea;
        textArea = new MyTextArea();
        //textField should listen to customEventObject
        panel.add(textArea, BorderLayout.CENTER);
        textArea.setColumns(10);
        textArea.addMyListener(new MyListener() {
            @Override
            public void actionPerformed(MyEvent e) {
                System.out.println(e.getArg());

            }
        });
    }
    protected void fireEvent(String str) {
        // if we have no listeners, do nothing...
        if (listeners != null && !listeners.isEmpty()) {
            // create the event object to send
            MyEvent event = new MyEvent(this, str);

            // make a copy of the listener list in case
            //   anyone adds/removes listeners
            Vector targets;
            synchronized (this) {
                targets = (Vector) listeners.clone();
            }

            // walk through the listener list and
            //   call the sunMoved method in each
            Enumeration e = targets.elements();
            while (e.hasMoreElements()) {
                MyListener l = (MyListener) e.nextElement();
                l.actionPerformed(event);
            }
        }
    }
}
class MyTextArea extends TextArea implements Serializable {
    private transient Vector listeners;
    synchronized public void addMyListener(MyListener l) {
        if (listeners == null)
            listeners = new Vector();
        listeners.addElement(l);
    }  
    synchronized public void removeMyListener(MyListener l) {
        if (listeners == null)
            listeners = new Vector();
        listeners.removeElement(l);
    }
}
//--------------------------------------------------------------
interface MyListener extends EventListener {
    public void actionPerformed(MyEvent e);
}
//--------------------------------------------------------------
class MyEvent extends EventObject {
    private String arg;
    public MyEvent(Object source, String arg) {
        super(source);
        this.arg = arg;
    }
    public String getArg() {
        return this.arg;
    }
}

最佳答案

首先,您没有向 CustomListener 中的 listener 字段添加任何监听器。其次,MyTextArea 中的监听器永远不会被调用。

编辑

澄清一下:

您的 MyTextArea 类中有一个 Vector 监听器,但没有方法来触发该事件。根据我对您问题的理解,您希望 MyTextArea 成为 CustomEvent 的监听器,但您将其设计为生成事件的类,而不是接收事件的类。所以我会像这样更改 MyTextArea :

class MyTextArea extends TextArea implements MyListener {

    @Override
    public void actionPerformed(MyEvent e) {
        System.out.println(e.getArg());
    }
}

现在 MyTextArea 实现了 MyListener,您可以将其添加到 CustomEvent.fillPanel() 中的监听器列表中:

void fillPanel() {
    panel = new JPanel();
    panel.setLayout(new BorderLayout(0, 0));
    final MyTextArea textArea;
    textArea = new MyTextArea();
    //textField should listen to customEventObject
    panel.add(textArea, BorderLayout.CENTER);
    textArea.setColumns(10);
    listeners.add(textArea);
}

关于java - 如何添加监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175509/

相关文章:

java - 如何响应鼠标点击形状

c++ - 是否可以在 Linux 中以编程方式单击另一个应用程序的按钮?

javascript - 使弹出导航模式靠近区域外的触摸事件

java - json 请求的 AsycTask 问题

java - 使用 FXML 在 JavaFX 中循环/foreach

java - 无法通过 jMeter.bat 在 Windows 8.1 上运行 jMeter 5.0

java - JDesktopPane - 最小化 JInternalFrames

java - hbase 客户端 API 卡在 table.get(row),

java - vlcj播放视频黑屏

javascript - 单击时按钮会递增并多次触发