イベントを処理するために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 ) を実装する必要があります。
それが正しいか?
私は別の疑問を持っています: このコーディングスタイルはかなりひどいようです (しかし、私はそれを知らないので、それは私の印象だけかもしれません)。
TNX
アンドレア