一、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();
}
}
附注:
本文如有错漏之处,烦请不吝指正,谢谢!