我正在研究 Java Swing 和适配器来处理事件,但我对我正在研究的以下工作示例有一些疑问:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
public class ListenerDemo extends JPanel implements MouseMotionListener{
// Label che visualizzano la posizione X ed Y del cursore:
JLabel labelX;
JLabel labelY;
public ListenerDemo() {
/* Add a MouseMotionListener to this object to catch when the user uses the mouse: */
addMouseMotionListener(this);
Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 50);
TitledBorder borderX = new TitledBorder("Mouse X");
TitledBorder borderY = new TitledBorder("Mouse Y");
borderX.setTitleJustification(TitledBorder.CENTER);
borderY.setTitleJustification(TitledBorder.CENTER);
labelX = new JLabel("0");
labelX.setBorder(borderX);
labelY = new JLabel("0");
labelY.setBorder(borderY);
labelX.setFont(f);
labelY.setFont(f);
super.add(labelX);
super.add(labelY);
}
// NOT IMPLEMENTED:
public void mouseDragged(MouseEvent e) {}
// IMPLEMENTED:
public void mouseMoved(MouseEvent e) {
labelX.setText("X : "+e.getX());
labelY.setText("Y : "+e.getY());
}
public static void main(String [] argv) {
// WindowsAdapter che implementa solo il metodo WindowClosing()
WindowAdapter adpt = new WindowAdapter() {
/*
* Alla chiusura della finestra ripassa il focus al frame principale.
* @param A low-level event that indicates that a window has changed its status
*/
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
JFrame frame = new JFrame("ListenerDemo"); // Frame esterno
// Add at the frame ONLY the anonymous adapter WindowAdapter class:
frame.addWindowListener(adpt);
// Add to the ContentPane inside the frame the ListenerDemo listener:
frame.getContentPane().add(new ListenerDemo(), null);
// Display the window:
frame.pack();
frame.setVisible(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
}
我很难理解这个程序的逻辑:
第一个疑问是为什么 **ListenerDemo类扩展了 JPanel 并实现了MouseMotionListener?
我认为程序的逻辑如下:
在main()方法中,我创建了一个新的WindowAdapter对象,它是 WindowAdapter 的一个实例,它允许我只实现一些处理与我的WindowEvent事件相关的事件的方法。所以,使用这个适配器,我可以避免实现一些我不感兴趣的监听器方法。在这种情况下,WindowAdapter 只实现与关闭窗口相关的方法,而不实现其他窗口事件。
这个推理正确吗?
下面的示例显示了与使用经典侦听器概念的区别,其中我必须实现处理与特定侦听器相关的所有事件的所有方法。
在此示例中,在我的 main() 中,我将自定义ListenerDemo添加到框架的内容中,并且我认为此侦听器通过以下行将addMouseMotionListener添加到当前对象:
addMouseMotionListener(this);
因此,我有一个侦听器,可以在我的框架内容中捕获与鼠标使用相关的所有事件。
在这种情况下,因为我使用的是监听器,所以我必须实现MouseMotionListener监听器的两个方法:addMouseMotionListener和removeMouseMotionListener
这是对的吗?
我还有一个疑问:在我看来,这种编码风格很糟糕(但也许这只是我的印象,因为我不知道)因为它在一个类中完成,我可以用更好的方式将它分开吗?
肿瘤坏死因子
安德烈亚