我几乎很难向我的文本区域添加自定义事件,但几天后我仍然无法处理它!我阅读了很多资源,终于可以编写下面的代码了。
问题
我认为一切都是正确的,但我只是错误地添加了监听器。(也许还有其他问题)。我不知道如何解决它,还是这根本就是问题的原因?
目的
我想让这个工作(用于测试),然后在我的主项目中使用它,所以下面的代码只是为了避免不相关的事情。
场景
我希望按钮触发我的文本区域监听的自定义事件。请考虑(由于我的主要项目设计)我必须在方法中定义和添加文本区域,这是我的问题的主要根源。但不幸的是我无法改变这个决定。
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/