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

一、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即可。

0818b9ca8b590ca3270a3433284dd417.png

最后,更新一下右键菜单,利用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包下载地址:点击打开链接

(http://yun.baidu.com/share/link?shareid=3335722254&uk=1175471698)

附注:可执行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();

}

}

附注:

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值