我是Java初学者,现在当我开始使用接口时,我想知道究竟发生了什么。我想一个很好的例子是ActionListener接口。
我对接口的了解是,它强制您实现接口给出的方法。但是我得到的是,调用actionPerformed(ActionEvent e)方法的地方。是否有任何简单的例子向我展示后台会发生什么?不管怎样,谢谢。
答案 0 :(得分:1)
如果您需要详细信息,请在ActionListener#actionPerformed
:
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
public class ListenerTracer extends JPanel {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() { createAndShowGUI(); }
});
}
public ListenerTracer() {
JButton b1 = new JButton("Press me");
b1.setVerticalTextPosition(AbstractButton.CENTER);
b1.setHorizontalTextPosition(AbstractButton.CENTER);
b1.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent event) {
Exception e = new Exception();
e.printStackTrace();
}
});
add(b1);
JTextArea textArea = new JTextArea("actionListener printstacktrace:\n", 50, 50);
JScrollPane scrollPane = new JScrollPane(textArea);
add(scrollPane);
Console.redirectOutput(textArea);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("ListenerTracer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ListenerTracer contentPane = new ListenerTracer();
contentPane.setOpaque(true);
frame.setContentPane(contentPane);
frame.pack();
frame.setVisible(true);
}
private static class Console implements Runnable {
JTextArea displayPane;
BufferedReader reader;
private Console(JTextArea displayPane, PipedOutputStream pos) {
this.displayPane = displayPane;
try {
PipedInputStream pis = new PipedInputStream(pos);
reader = new BufferedReader( new InputStreamReader(pis) );
}
catch (IOException e) {}
}
public void run() {
String line = null;
try {
while ((line = reader.readLine()) != null) {
displayPane.append( line + "\n" );
displayPane.setCaretPosition(displayPane.getDocument().getLength());
}
System.err.println("im here");
}
catch (IOException ioe) {
JOptionPane.showMessageDialog(null, "Error redirecting output : "+ioe.getMessage());
}
}
public static void redirectOutput(JTextArea displayPane) {
PipedOutputStream pos = new PipedOutputStream();
System.setErr(new PrintStream(pos, true) );
Console console = new Console(displayPane, pos);
new Thread(console).start();
}
}
}
点击"按我"按钮产生此输出:
actionListener printstacktrace:java.lang.Exception at ListenerTracer $ 2.actionPerformed(ListenerTracer.java:21)at javax.swing.AbstractButton.fireActionPerformed(未知来源)at javax.swing.AbstractButton $ Handler.actionPerformed(Unknown Source)at javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)at javax.swing.DefaultButtonModel.setPressed(未知来源)at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 来自)java.awt.Component.processMouseEvent(未知来源)at javax.swing.JComponent.processMouseEvent(未知来源)at java.awt.Component.processEvent(未知来源)at java.awt.Container.processEvent(未知来源)at java.awt.Component.dispatchEventImpl(未知来源)at java.awt.Container.dispatchEventImpl(未知来源)at java.awt.Component.dispatchEvent(未知来源)at java.awt.LightweightDispatcher.retargetMouseEvent(未知来源)at java.awt.LightweightDispatcher.processMouseEvent(未知来源)at java.awt.LightweightDispatcher.dispatchEvent(未知来源)at java.awt.Container.dispatchEventImpl(未知来源)at java.awt.Window.dispatchEventImpl(未知来源)at java.awt.Component.dispatchEvent(未知来源)at java.awt.EventQueue.dispatchEventImpl(未知来源)at java.awt.EventQueue.access $ 400(未知来源)at java.awt.EventQueue $ 3.run(未知来源)at java.awt.EventQueue $ 3.run(未知来源)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(未知 来源)at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(未知 来自)java.awt.EventQueue $ 4.run(未知来源)at java.awt.EventQueue $ 4.run(未知来源)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(未知 来自)java.awt.EventQueue.dispatchEvent(未知来源)at java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 在java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来自java.awt.EventDispatchThread.pumpEvents(未知来源) at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.run(未知来源)
我从camickr's answer to redirecting-system-out-to-jtextpane借用了控制台重定向代码。
答案 1 :(得分:0)
当用户做某事时会调用。单击按钮,选择菜单。 actionListener
中的每一个都被称为特定事件。我想现在,您无需担心它的确切位置,只是在哪里以及为什么。
答案 2 :(得分:0)
对于JButton,其超类AbstractButton
通过方法fireActionPerformed
调用actionPerformed
方法,该方法是受保护的方法。如果您检查源代码,您将看到它构造一个ActionEvent
对象并使用它作为参数调用actionPerformed
。