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

来源:互联网 发布:网络布线验收标准 编辑:程序博客网 时间:2024/06/05 13:29

一、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 stubinit();}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() {@Overridepublic void windowClosing(WindowEvent e) {// TODO Auto-generated method stubframe.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 stubinit();}//用于初始化界面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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubFileDialog 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 blocke1.printStackTrace();} finally {try {bReader.close();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}});/* * 保存文件菜单,因为代码和“另存为”高度相似,所以抽取出来做了一个内部类SaveActionListener */this.saveMenu.addActionListener(new SaveActionListener());/* * 另存为菜单,和保存菜单的区别是: * 保存菜单会判断文件是否为空,不为空则直接保存,否则打开FileDialog获取fileDir和fileName之后再保存; * 另存为菜单无论文件是否为空,都打开FileDialog,此处实现代码为file = null; */this.saveAsMenu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubfile = null;new SaveActionListener().actionPerformed(e);}});}/* * 保存事件内部类,因为保存和另存为代码高度相似,区别就一句代码file = null; */class SaveActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(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 blocke1.printStackTrace();} finally {try {bWriter.close();} catch (IOException e1) {// TODO Auto-generated catch blocke1.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();}}

附注:

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


0 0
原创粉丝点击