Java--用AWT编写图形用户界面(入门篇二)

本文介绍了Java AWT事件处理模型的基本概念,包括事件(Event)、事件源(EventSource)和事件处理者(EventHandler)。通过示例详细讲解了如何使用ActionEvent和ActionListener来响应按钮点击事件,同时介绍了低级事件与高级事件的区别以及如何使用内部类和匿名类来实现事件监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AWT事件处理模型

在事件处理的过程中,主要涉及以下三类对象:
Event:事件,用户对界面操作在Java语言上的描述,以类的形式出现
Event Source:事件源,事件发生的场所,通常就是各种组件
Event Handler:事件处理者,接受事件对象并对其进行处理的对象
举个例子:TestButton.java

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestButton {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Frame f = new Frame("Test");
		Button b = new Button("Press Me!");
		b.addActionListener(new ButtonHandler());     //该方法的参数是事件处理者,要处理的是ActionEvent事件
		f.setLayout(new FlowLayout());
		f.setSize(200,200);
		f.add(b);
		f.setVisible(true);
 
	}
}
	class ButtonHandler implements ActionListener{       //实现接口ActionListener才能充当事件ActionEvent的处理者
		public void actionPerformed(ActionEvent e) {          //系统产生的ActionEvent事件对象被当前做参数传递给该方法
			System.out.println("Action occurred");
		}
	}

在这里插入图片描述
执行后,单击按钮就会在命令行中输出“Action occurred”
在钙离子中,事件源就是按钮,事件是ActionEvent对象,事件处理者是ButtonHandler对象,事件发生后,java的运行系统会自动调用ButtonHandler对象的actionPerformed()方法进行处理,而且事件ActionEvent对象将被当作参数传递给actionPerformed()方法;

事件类

1.java.lang.Object
java。util。EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。

2.java.awt.AWTEvent
与AWT有关的所有事件类都由java.awt.AWTEvent类派生,这些AWT事件被分为低级事件和高级事件两大类;低级时间是指基于组件和容器的事件,如鼠标的点击、进入等都是低级事件,高级事件可以不和特定的动作相关联,而依赖于触发此事件的类;
低级事件:ComponentEvent(组件事件:组件尺寸的变化,移动)
ContainerEvent(容器事件:组件的增加,移动)
WindowEven(窗口事件:关闭窗口,图标化)
高级事件:ActionEvent(动作事件:按钮按下,TextField中按Enter键)
TextEvent(文本事件:文本对象改变)

事件适配器

Java语言为为一些Listener接口提供了适配器(Adapter)类。
java.awt.event包中定义的事件适配器:
ComponentAdapter(组件适配器)
ContainerAdapter(容器适配器)
FocusAdapter(焦点适配器)
KeyAdapter(键盘适配器)

用内部类实现事件处理
内部类是被定义于另一个类中的类。
编写事件驱动程序,内部类很方便

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestInnerClass {

		private Frame f;
		private TextField tf;
		public void launchFrame() {
			f = new Frame("Inner");
			tf = new  TextField(30);
			Label label = new Label("Click and drag the mouse");
			f.add(label, BorderLayout.NORTH);
			f.add(tf,BorderLayout.SOUTH);
			f.addMouseMotionListener(new MyMouseMotionListener());    //参数为内部类
			f.addWindowListener(new MyWindowListener());       
			f.setSize(200,200);
			f.setVisible(true);
		}
		class MyMouseMotionListener extends MouseMotionAdapter {   //内部类的开始

			@Override
			public void mouseDragged(MouseEvent e) {
				// TODO Auto-generated method stub
		        String s = "Mouse dragging: x = "+e.getX()+"y = "+e.getY();
		        tf.setText(s);
			}                                              //内部类结束
		}
		class MyWindowListener extends WindowAdapter{              //内部类的开始
			public void windowClosing(WindowEvent e) {
				System.exit(1);
			}
			
		}                                             //内部类结束
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			TestInnerClass tic = new TestInnerClass();
			tic.launchFrame();

	}

}

在这里插入图片描述

匿名类
所谓匿名,就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AnonymousClass {

		private Frame f;
		private TextField tf;
		public AnonymousClass() {
			f = new Frame("Inner");
			tf = new  TextField(30);
		}
		public void launchFrame() {
			Label label = new Label("Click and drag the mouse");
			f.add(label, BorderLayout.NORTH);
			f.add(tf,BorderLayout.SOUTH);
			f.addMouseMotionListener(new MouseMotionAdapter() {         //匿名类开始
				public void mouseDragged(MouseEvent e) {
					// TODO Auto-generated method stub
			        String s = "Mouse dragging: x = "+e.getX()+"y = "+e.getY();
			        tf.setText(s);
				}
			});                                             //匿名类结束
			f.addWindowListener(new WindowAdapter() {                    //匿名类开始
				public void windowClosing(WindowEvent e) {
					System.exit(1);
				}
			});                                                      //匿名类结束
			f.setSize(200,200);
			f.setVisible(true);
		}
		
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			AnonymousClass obj = new AnonymousClass();
			obj.launchFrame();

	}

}

在这里插入图片描述
两个例子实现的功能都是完全一样的,只不过采取的方式不同;

java写GUI图形界面 public class login extends JFrame { private JComboBox nameJComboBox; private JPanel userJPanel; private JLabel pictureJLabel; private JButton okJButton,cancelJButton; private JLabel nameJLabel,passwordJLabel,note; private JPasswordField passwordJPasswordField; private String name1; private String password1; private String user; private ImageIcon myImageIcon; public login( ) { createUserInterface(); // 调用创建用户界面方法 } private void createUserInterface() { Container contentPane = getContentPane(); contentPane.setLayout( null ); userJPanel = new JPanel(); userJPanel.setBounds( 35, 120, 300, 96 ); userJPanel.setBorder(BorderFactory.createEtchedBorder() ); //显示一圈边儿 userJPanel.setLayout( null ); contentPane.add( userJPanel ); nameJComboBox = new JComboBox(); nameJComboBox.setBounds( 100, 12, 170, 25 ); nameJComboBox.addItem( "admin" ); nameJComboBox.addItem( "aloie" ); nameJComboBox.setSelectedIndex( 0 ); nameJComboBox.setEditable(true); userJPanel.add( nameJComboBox ); pictureJLabel=new JLabel(); pictureJLabel.setBounds(45,0,380,118); pictureJLabel.setIcon(new ImageIcon("pic.gif")); contentPane.add(pictureJLabel); nameJLabel=new JLabel("姓 名:"); nameJLabel.setBounds(20,12,80,25); userJPanel.add(nameJLabel); passwordJPasswordField=new JPasswordField(); passwordJPasswordField.setBounds(100,60,170,25); userJPanel.add(passwordJPasswordField); passwordJLabel=new JLabel("密 码:"); passwordJLabel.setBounds(20,60,80,25); userJPanel.add(passwordJLabel); note=new JLabel("密码与用户名相同"); note.setBounds(0,295,180,25); add(note); okJButton=new JButton("登 陆"); okJButton.setBounds(60,250,80,25); contentPane.add(okJButton); okJButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { okJButtonActionPerformed(event); } } ); cancelJButton=new JButton("取 消"); cancelJButton.setBounds(210,250,80,25); contentPane.add(cancelJButton); cancelJButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent event ) { System.exit(0); //退出登陆 } } ); setTitle( "登陆窗口" ); setSize( 380, 350 ); setResizable( false ); //将最大化按钮设置为不可用 } private void okJButtonActionPerformed( ActionEvent event ) { //okJButton响应事件,检查用户名和密码的匹配 name1= nameJComboBox.getSelectedItem().toString(); if (name1.equals("admin") ) { if (passwordJPasswordField.getText().equals("admin")) { showNewWindow(); setVisible( false); } else { JOptionPane.showMessageDialog( this,"密码错误,拒绝登陆", "密码错误 !", JOptionPane.ERROR_MESSAGE ); } } else if (name1.equals("aloie")) { if ( passwordJPasswordField.getText().equals("aloie") ) { showNewWindow(); setVisible(false); } else { JOptionPane.showMessageDialog( this,"密码错误,拒绝登陆", "密码错误 !", JOptionPane.ERROR_MESSAGE ); } } } public void showNewWindow() { JFrame jf=new JFrame("main Frame"); jf.setSize(500,400); jf.setVisible(true); jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } public static void main( String[] args ) { JFrame.setDefaultLookAndFeelDecorated(true); login mylogin = new login( ); mylogin.setVisible( true ); mylogin.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值