Java イベントを学習する前に、Java 内部クラス、一般的な Java コンポーネント、コンテナ、レイアウト マネージャー、および Java 抽象ウィンドウ ツールキットについて一定の理解を持っている必要があります。以下の知識ポイントと組み合わせると、いくつかの簡単なウィンドウ プログラムを実行できます。 (推奨: java ビデオ チュートリアル )
Java 言語は、認可イベント モデルを使用してイベントを処理します。このモデルでは、各コンポーネントには、ボタンのクリック イベント、テキスト フィールドのコンテンツ変更イベントなど、対応するイベントがあります。
イベントがトリガーされると、コンポーネントは、コンポーネントによって登録された各イベント リスナーにイベントを送信します。イベント リスナーは、さまざまなイベントに対応するイベントの処理を定義します。このとき、イベント リスナーとプロセッサは、このイベントの処理を完了するには、さまざまなイベント情報に基づいてさまざまなイベント ハンドラーを呼び出します。イベント情報は、イベント リスナーがトリガーされた後にのみ受信されます。
このモデルの顕著な特徴は、コンポーネントがトリガーされたときに、コンポーネント自体は処理せず、処理操作をサードパーティに任せて完了させることです。たとえば、GUI でボタンがクリックされると、そのボタンはイベント ソース オブジェクトになります。ボタン自体には、このクリックに反応する権利はありません。ボタンが行うことは、登録されたリスナー (イベント処理 (または本質的には、本質的には、イベント処理) に情報を送信することです。 、それはクラスでもあります)を処理します。
Java のイベント処理を理解するには、次の 3 つの重要な概要を理解する必要があります。
(1)、イベント - ユーザー操作によって生成されるイベント
(2)、イベント ソース イベント ソース - イベントを生成するコンポーネント
(3)、イベント処理メソッド イベントhandle - イベントの処理方法
1. イベント処理の基本原則
ボタンでイベントがトリガーされると、仮想マシンはクリックを生成します。イベント オブジェクトは次のとおりです。登録されているボタンに関連する処理メソッド、つまりイベントソースを検索し、このメソッドにイベントオブジェクトを渡してこのメソッドを実行します。
サンプル プログラム:
次のプログラムでは、JButton jb がイベント ソース、ClickAction がイベント ハンドラーで、 jb.addActionListener(a); によってイベント ソースとイベント ハンドラーが関連付けられます。イベント ソースでクリック イベントが発生すると、ClickAction で定義されたコードが実行されます。
ソース コードは次のとおりです:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class EventTest { public static void main(String[] args) { JFrame j = new JFrame("示例程序1"); //1、事件源jb按钮就是事件源,因为要点击它 JButton jb = new JButton("click"); //2、事件处理程序ClickAction表示事件处理程序 ClickAction a = new ClickAction(); //3、关联,将事件源和事件处理程序a关联起来,意思是发生点击执行a jb.addActionListener(a); //将jb源事件添加到窗口中。 j.getContentPane().add(jb); j.pack(); j.setVisible(true); } } //事件处理程序,点击就是一个Action事件 class ClickAction implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("hello"); } }
2. イベント オブジェクト
上記の例では、ActionEvent がイベント オブジェクトです。このイベントは、JButton が押されたときに JButton によって生成されます。イベントはリスナー登録によって登録されたActionListenerオブジェクトに渡され、イベントの発生時刻やイベント発生時のイベントソースなどの最も一般的な情報を取得できます。
ActionEvent の一般的なメソッドは次のとおりです:
(1)String getActionCommand(): このタイプのアクションに関連するコマンド文字列を返します。デフォルトのコンポーネントはタイトルです。
(2)int getModifiers(): このアクションが発生したときに同時に押されたキーボード ボタンを返します。
(3)long getWhen(): このイベントが発生したときに、イベントの長い形式を返します。
サンプルプログラム:
ソースコードは以下のとおりです:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class EventTest2 { public static void main(String[] args) { JFrame j = new JFrame("示例程序2"); JPanel jp = new JPanel(); JLabel j1 = new JLabel("请点击"); JButton jb = new JButton("click"); JButton jb1 = new JButton("click"); ClickAction2 a = new ClickAction2(); jb1.addActionListener(a);//如果jb1上发生了Action事件就执行a里面的代码 jb.addActionListener(a); jp.add(j1); jp.add(jb); jp.add(jb1); j.add(jp); j.setSize(400, 200); j.setVisible(true); } } class ClickAction2 implements ActionListener{ //事件发生时,actionPerformed方法会被虚拟机调用,事件对象回传给该方法 @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub long d = e.getWhen();//事件发生的事件 Date date = new Date(d);//转化为相应的时间 System.out.println(date); JButton sou = (JButton)e.getSource();//发生的事件源 sou.setText("点不着");//将点击发生的按钮的按钮设为点不着 //如果没有设置过ActionCommand,默认得到的是按钮的标题 String com = e.getActionCommand(); System.out.println("command is: " +com); } }
3. イベントの種類
グラフィカルインターフェイス開発では多くのイベントが存在します。これらのイベント EventObject を最上位およびクラスとして、イベントの種類に応じてツリー構造が形成されます。
詳細については、以下の図を参照してください。
EventObject はすべてのイベント クラスの親クラスであり、2 つのメソッドが含まれています。
(1), Object getSource(): イベントが最初に発生したオブジェクト
(2), String toString(): この EventObject の String 表現を返します。
getSource() を通じて: どのオブジェクトでイベントが発生したかを知ることができます。
その他のイベントクラスの意味については、ソースコードの説明といくつかのクラスの簡単なドリルを以下に示します。
MouseEvent クラス
コンポーネントが押される、放される、クリックされる、移動またはドラッグされると、マウス イベントがトリガーされます。
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; public class MouseListenerTest { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); MouL w = new MouL(); j.addMouseListener(w); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MouL implements MouseListener{ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠标的位置: " + e.getX() + "," + e.getY()); System.out.println("点击发生了"); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub System.out.println("按下"); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub System.out.println("松开"); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠标进入了窗口"); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠标离开了窗口"); } }
WindowEvent Class
ウィンドウ イベントは、ウィンドウが開いたり閉じたり、最大化または最小化されたときにトリガーされます
import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; public class WindowsListenerTest { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); WindowL w = new WindowL(); j.addWindowListener(w); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class WindowL implements WindowListener{ @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口打开时我执行windowOpened"); } @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub System.out.println("windowClosing"); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口关闭时我执行windowClosed"); } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口最小化时我执行windowIconified"); } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口回复时我执行windowDeiconified"); } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口变成活动状态时我执行mouseClicked"); } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口变成不活动状态时我执行windowDeactivated"); } }
ContainerEvent Class
イベントが発生したときコンポーネントがコンテナに追加されたとき、またはコンポーネントがコンテナから削除されたときにトリガーされます。
import java.awt.event.ContainerListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class ContainerEvent { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); ContL w = new ContL(); JPanel jp = new JPanel(); jp.addContainerListener(w); JButton del = new JButton("删除"); JButton add = new JButton("add"); jp.add(add); jp.add(del);//触发组件添加了 jp.remove(del);//触发组件删除了 j.getContentPane().add(jp); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class ContL implements ContainerListener{ @Override public void componentAdded(java.awt.event.ContainerEvent e) { // TODO Auto-generated method stub System.out.println("组件添加了"); } @Override public void componentRemoved(java.awt.event.ContainerEvent e) { // TODO Auto-generated method stub System.out.println("组件删除了"); } }
FocusEvent
マウスのクリックやその他の操作により、コンポーネントがフォーカスを取得したり、フォーカスを失ったりします。コンポーネントがフォーカスを取得するか、フォーカスを失うと、focus イベントがトリガーされます
import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class FocusTest { public static void main(String[] args) { JFrame j = new JFrame("key test"); JPanel jp = new JPanel(); JButton j1 = new JButton("1"); JButton j2 = new JButton("2"); j1.addFocusListener(new FocusL()); j2.addFocusListener(new FocusL()); jp.add(j1); jp.add(j2); j.add(jp); j.setSize(600, 500); j.setVisible(true); } } class FocusL implements FocusListener{ @Override public void focusGained(FocusEvent e) { //得到FocusEvent发生时的对象,转化为按钮 // TODO Auto-generated method stub JButton j = (JButton)e.getSource(); //得到按钮的标题 String title = j.getText(); System.out.println("focusGained:按钮" + title + "获得焦点"); } @Override public void focusLost(FocusEvent e) { // TODO Auto-generated method stub JButton j = (JButton)e.getSource(); String title = j.getText(); System.out.println("focusLost:按钮" + title + "失去焦点"); } }
4. 複数のリスナー
一般に、イベント ソースはさまざまな種類のイベントを実行できます。が生成されるため、さまざまな種類のリスナーを登録 (トリガー) できます。
複数のリスナーをイベント ソース コンポーネントに登録でき、リスナーを複数の異なるイベント ソースに登録できます。
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; import javax.swing.JTextField; public class MultiListenerTest { public static void main(String[] args) { JFrame a = new JFrame("事件处理"); JTextField jf = new JTextField(); a.add(jf, "South"); MouseM m = new MouseM(); //同一事件源上注册两个事件监听程序 //鼠标的监听程序如点击等 a.addMouseListener(m); //鼠标移动的监听程序 a.addMouseMotionListener(m); a.setSize(200, 200); a.setVisible(true); } } class MouseM implements MouseMotionListener, MouseListener{ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub System.out.println("clicked" + "x:" + e.getX() + ",y:" + e.getY()); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mousePressed"); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseRelsased"); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseEntered"); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseExited"); } @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub System.out.println("拖动:" + e.getPoint()); } @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub System.out.println("移动:" + e.getPoint()); } }
5. イベント アダプター
プログラミングを簡素化するために、JDK はほとんどのイベント リスナー インターフェイスに対応する実装クラスを定義します - アダプター内のイベント アダプター クラスはすべてのメソッドを実装します対応するリスナーインターフェイスで実行されますが、何も行いません。
したがって、定義されたリスナー クラスはイベント アダプター クラスを継承し、必要なメソッドのみをオーバーライドできます。
次のアダプターがあります:
- ComponentAdapter (コンポーネントアダプター)
- ContainerAdapter (容器适配器)
- FocusAdapter (焦点适配器)
- KeyAdapter (键盘适配器)
- MouseAdapter (鼠标适配器)
- MouseMotionAdapter (鼠标运动适配器)
- WindowAdapter (窗口适配器)
鼠标适配器示例程序:MouseListener中由多个方法,但在这里只实现了mouseClicked()
package 图形界面设计; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; public class AdapterTest { public static void main(String[] args) { JFrame z = new JFrame("事件适配器测试"); z.setSize(500, 400); MouseLS a = new MouseLS(); //注册z上的鼠标事件处理程序,发生点击等事件执行a里的代码 z.addMouseListener(a); z.setVisible(true); z.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MouseLS extends MouseAdapter{ public void mouseClicked(MouseEvent e){ // 打印出鼠标点击时的x点和y点的坐标 System.out.println("鼠标点击了:" + e.getX() + "," + e.getY()); } }
更多java知识请关注java基础教程栏目。
以上がJavaのイベントを画像とテキストで詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。