【java】java.awt基础(简易记事本代码)

本文介绍了Java AWT基础知识,包括组件、布局管理和侦听器的使用。讲解了如何创建窗体、设置布局,以及实现右键菜单功能。文章还提到了AWT与平台的耦合问题,建议使用Swing进行跨平台界面编程。最后,分享了一个基于Java AWT实现的简易记事本应用的下载链接,该应用适用于JDK 1.8环境。

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

一、java.awt

        可能是水平还比较低,感觉awt包没有什么难点和太复杂的地方,java.awt包存放组件,java.awt.event存放事件、侦听器,简单使用掌握这两个包就好了。

        值得申明的是,java.awt因为和平台耦合比较大,因此移植性较差,如果想要做平台通用的界面程序,还是用java.swing包比较靠谱。

二、组件

        java.awt包中存放了所有组件,如下图,其中值得一提的是Container组件。只有Window下的Frame和Dialog可以独立存在,其他的组件必须依托与这两者,即先有这两者的对象之后,才能add其他的组件进来从而组成一个窗体。

        另外,对于窗体布局,java中用布局管理器类来实现,java中实现了6种布局管理器,其中Frame默认是BorderLayout布局管理器(不指定区域,则默认占满),Panle默认是FlowLayout布局管理器(不指定流方向,则默认居中)。如果想要对窗体中的组件进行绝对定位,则只需要setLayout(null)的时候传入null即可。


        最后,更新一下右键菜单,利用PopupMenu类来实现,怎么做呢,首先准备PopupMenu的过程和准备MenuBar差不多,准备好PopupMenu之后需要被add到其他像TextArea、Panel等组件(MenuBar则是需要其他组件setMenuBar来实现而不是add),区别在于需要为add了PopuMenu的组件添加鼠标的mouseReleased事件,通过mouseReleased中传入的Event对象的方法isPopupTriger方法来判断是否是鼠标右键,最后在调用PopupMenu自身的show方法(show方法传入其被add到的组件对象,和Event中获取鼠标点击的坐标即可),至此右键菜单生成,只需要在为右键菜单中的自对象添加各自的事件即可,具体代码如下添加了注释的部分。

package menu_demo;

import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class PopupMenuDemo {
	private Frame frame;
	private PopupMenu pop;
	private Menu fileMenu;
	private MenuItem openMenuItem;
	
	public PopupMenuDemo() {
		// TODO Auto-generated constructor stub
		init();
	}
	
	private void init(){
		frame = new Frame("pop testing");
		frame.setBounds(100, 200, 300, 400);
		
		openMenuItem = new MenuItem("open file");
		fileMenu = new Menu("file");
		fileMenu.add(openMenuItem);
		
		pop = new PopupMenu();
		pop.add(fileMenu);
		frame.add(pop);
		
		event();
		frame.setVisible(true);
	}
	
	private void event(){
		/*
		 * 为frame添加鼠标右键
		 * 添加右键功能成功之后,只需要在为PopupMenu中的各个Menu对象添加相应的事件即可
		 */
		frame.addMouseListener(new MouseAdapter() {
			public void mouseReleased(MouseEvent e) {
				if(e.isPopupTrigger()){
					pop.show(frame, e.getX(), e.getY());
				}
			}
		});
		
		frame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				frame.dispose();
			}
		});
	}
	
	public static void main(String[] args) {
		new PopupMenuDemo();
	}
}

三、侦听器

        要想一个按钮被点击以后执行你所希望的动作,你需要为这个按钮绑定侦听器,并在侦听器中实现相应的动作代码。整个过程可以这样描述,首先为事件源Button绑定侦听器,当Button发生了点击事件的时候,虚拟机会将“事件”封装成一个Event对象并传递给侦听器,此时侦听器会根据Event封装的内容调用不同的方法来处理事件,而至于侦听器中的处理方法则需要自己来实现,如以下例子中的event()方法。

        至于侦听器的多种实现方式,根据实际场景选择即可。

四、简易记事本

        可执行jar包下载地址:点击打开链接

        附注:可执行jar包环境为JDK 1.8

package notepad;

import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 简易记事本
 * @author reliveIT
 *
 */
public class SimpleNotepad {
	private Frame frame;
	private MenuBar mb;
	private Menu fileMenu;
	private MenuItem saveMenu;
	private MenuItem openMenu;
	private MenuItem saveAsMenu;
	private TextArea textArea;
	private File file;
	
	public SimpleNotepad() {
		// TODO Auto-generated constructor stub
		init();
	}
	
	//用于初始化界面
	private void init(){
		this.frame = new Frame("simple notepad");
		this.frame.setBounds(100, 100, 800, 600);
		
		openMenu = new MenuItem("open file");
		saveMenu = new MenuItem("save file");
		saveAsMenu = new MenuItem("save as file");
		fileMenu = new Menu("file");
		fileMenu.add(openMenu);
		fileMenu.add(saveMenu);
		fileMenu.addSeparator();
		fileMenu.add(saveAsMenu);
		mb = new MenuBar();
		mb.add(fileMenu);
		frame.setMenuBar(mb);
		
		textArea = new TextArea("");
		frame.add(textArea);
		
		//该方法为组件添加侦听器并执行相关动作
		event();
		this.frame.setVisible(true);
	}
	
	//为组件添加侦听器和相关的动作
	private void event(){
		//窗口关闭事件
		this.frame.addWindowListener(new WindowAdapter() {
			 public void windowClosing(WindowEvent e) {
				 frame.dispose();
			 }
		});
		
		/*
		 * 打开文件菜单,先打开FileDialog,再把文件内容读进来
		 */
		this.openMenu.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				FileDialog openDialog = new FileDialog(frame, "open file", FileDialog.LOAD);
				openDialog.setVisible(true);
				file = getAndCheckFileOP(openDialog.getDirectory(), openDialog.getFile());
				if(file == null)
					return;
				textArea.setText("");
				BufferedReader bReader = null;
				try {
					bReader = new BufferedReader(new FileReader(file));
					String readLine = null;
					while((readLine = bReader.readLine()) != null){
						textArea.append(readLine + "\r\n");
					}
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} finally {
					try {
						bReader.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		});
		
		/*
		 * 保存文件菜单,因为代码和“另存为”高度相似,所以抽取出来做了一个内部类SaveActionListener
		 */
		this.saveMenu.addActionListener(new SaveActionListener());
		/*
		 * 另存为菜单,和保存菜单的区别是:
		 * 保存菜单会判断文件是否为空,不为空则直接保存,否则打开FileDialog获取fileDir和fileName之后再保存;
		 * 另存为菜单无论文件是否为空,都打开FileDialog,此处实现代码为file = null;
		 */
		this.saveAsMenu.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				file = null;
				new SaveActionListener().actionPerformed(e);
			}
		});
	}
	
	/*
	 * 保存事件内部类,因为保存和另存为代码高度相似,区别就一句代码file = null;
	 */
	class SaveActionListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			if(file == null){
				FileDialog saveDialog = new FileDialog(frame, "save file", FileDialog.SAVE);
				saveDialog.setVisible(true);
				file = getAndCheckFileOP(saveDialog.getDirectory(), saveDialog.getFile());
			}
			
			if(file != null){
				BufferedWriter bWriter = null; 
				try {
					bWriter = new BufferedWriter(new FileWriter(file));
					String strLine = textArea.getText();
					bWriter.write(strLine);
					bWriter.flush();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} finally {
					try {
						bWriter.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		}
	}
	
	//用于check打开FileDialog的时候,如果选择取消则会报异常
	private File getAndCheckFileOP(String fileDir, String fileName){
		if(fileDir == null || fileName==null || (fileName.trim()).equals(""))
			return null;
		else 
			return new File(fileDir, fileName);
	}
	
	public static void main(String[] args) {
		new SimpleNotepad();
	}
}

附注:

        本文如有错漏之处,烦请不吝指正,谢谢!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值