GUI--Graphical User Interface(图形用户接口)
CLI--Command Line Interface(命令行用户接口)
Java为GUI提供的对象都存在java.awt和javax.swing。
java.awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。属于重量级控件。由这个包开发的软件,在不同系统呈现的外观有所不同。
java.swing:在awt的基础上,建立了一套图形界面系统,其中提供了更多的组件,而且完全由java实现,增强了移植性,属轻量级控件。由这个包开发的软件,在任何系统呈现的外观都一样。
eclipse工具本身是纯java编写的,它使用的是swt外观包,这个外观包也是基于awt的,这是eclipse开发小组自己做的外观包,可以去eclipse官网下载。
常用GUI组件继承关系图:其中比较特殊的是Container,是一个可包含其他 AWT 组件的组件。
布局管理器:
事件监听机制:
1,事件源-----就是awt包或swing包中的那些图形界面组件。
2,事件-----每一个事件源都有自己特有的对应事件和共性事件。
3,监听器-----将可以触发的某一个事件的动作(不止一个动作)都已经封装到了监听器中。
4,事件处理-----以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情就是对产生的动作进行处理。
事件监听机制流程图:
一,窗体事件--使窗体的关闭按钮起作用
package GUI;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 窗体事件的运用--addWindowListener(WindowAdapter w)
*/
public class AwtDemo {
/**
* 创建图形化界面基本步骤:
* 1,创建frame窗体
* 2,对窗体进行基本设置
* 比如,大小、颜色、位置、布局等
* 3,定义组件,
* 4,将组件通过窗体的add方法添加到窗体中
* 5,通过setVisible(true)让窗体显示
*/
public static void main(String[] args) {
//Frame默认是边界布局管理器
Frame f = new Frame("my awt");
f.setSize(500, 400);//设置大小
f.setLocation(300, 100);
f.setLayout(new FlowLayout());
Button b = new Button("我是一个按钮");
f.add(b);
//addWindowListener方法的参数是一个WindowListener接口,
//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口,
//并覆盖了其中的所有方法,那么我们只要继承自WindowAdapter,覆盖自己需要的方法即可。
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
@Override
public void windowOpened(WindowEvent e) {
System.out.println("windowOpened");
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated");
}
});
f.setVisible(true);//必须调用setVisible方法使显示
}
}
二,Action事件
package GUI;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* Action事件--addActionListener(ActionListener a)
* 只有一个方法需要实现,没有对应的适配器,这是比较特殊的一点。大部分Listener都有对应的是适配器,只要接口里的方法超过3个的都有对应的是适配器。
*/
public class FrameDemo {
private Frame f;
private Button b;
FrameDemo(){
init();
}
public void init(){
f=new Frame("My frame");
f.setBounds(300, 200, 500, 400);
f.setLayout(new FlowLayout());
//将组件添加到frame中
b=new Button("My button");
f.add(b);
//加载窗体上事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//让按钮具备退出程序的功能
/**
* 按钮就是事件源,那么选择哪个监听器呢?
* 通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器,
* 需要查看该组件对象的功能。
* 通过查阅API中button的描述,发现按钮支持一个特有监听addActionListener(ActionListener e)
*
* 注意:ActionListener是一个接口,并且没有对应的适配器,
* 大部分Listener都有对应的是适配器,只要接口里的方法超过3个的都有对应的是适配器
*/
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("按钮退出");
System.exit(0);
}
});
}
public static void main(String[] args) {
new FrameDemo();
}
}
三,鼠标事件,键盘事件
实现按ESC键退出,按组合键CTRL+ENTER退出,双击鼠标操作的代码。
package GUI;
import java.awt.*;
import java.awt.event.*;
//鼠标事件,键盘事件
public class MouseAndKeyEvent {
private Frame f;
private Button b;
private TextField tf;
MouseAndKeyEvent(){
init();
}
public void init(){
f=new Frame("My frame");
f.setBounds(300, 200, 500, 400);
f.setLayout(new FlowLayout());
//将组件添加到frame中
b=new Button("My button");
tf = new TextField(10);//10列的文本框
f.add(tf);
f.add(b);
//加载窗体上事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){
//窗体事件
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//鼠标事件
b.addMouseListener(new MouseAdapter(){
private int count=1;
private int clickcount = 1;
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标进入该组件:"+ count++);
}
@Override
public void mouseClicked(MouseEvent e) {
//双击鼠标
if(e.getClickCount()==2){
System.out.println("鼠标双击:"+ clickcount++);
}
}
});
//按钮上加事件最好加ActionEvent
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("活动");
}
});
//键盘事件
b.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyCode()+"..."+e.getKeyText(e.getKeyCode()));
//按ESC键退出
if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.exit(0);
}
//按组合键CTRL+ENTER退出
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER){
System.exit(0);
}
}
});
tf.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {//注意这里如果是keyReleaseed事件的话,那么e.consume()是不管用的
int code = e.getKeyCode();
if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){
System.out.println(code+"非法");
e.consume();//这行代码保证非法字符不会写入文本框
}
}
/* @Override
public void keyReleased(KeyEvent e) {//如果是keyReleased事件的话,写了e.consume(),非法字符也会输入到文本框
int code = e.getKeyCode();
if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){
System.out.println(code+"非法");
e.consume();//这行代码保证非法字符不会写入文本框
}
}*/
});
}
public static void main(String[] args) {
new MouseAndKeyEvent();
}
}
四,文本框,文本域,对话框的使用
点击按钮,把第一个文本框输入的路径下的文件目录,显示到另外一个文本框中。如果第一个文本框输入的非法路径,显示提示框。
实现文本框中按回车,和点击按钮一个效果。提示框(对话框)的运用。
package GUI;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
//文本框,文本域,对话框
public class MyWindowDemo{
private Frame f;
private TextField tf;
private Button b;
private TextArea ta;
MyWindowDemo(){
init();
}
public void init(){
f=new Frame("My window");
f.setBounds(300,200,500,400);
f.setLayout(new FlowLayout());
tf=new TextField(55);
b=new Button("转到");
ta=new TextArea(25,65);
f.add(tf);
f.add(b);
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//实现文本框中按回车,和点击按钮一个效果
tf.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER){
showDir();
}
}
});
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
showDir();
}
});
}
private void showDir() {
String dirPath = tf.getText();
File dir =new File(dirPath);
if(dir.exists()&&dir.isDirectory()){
ta.setText("");
String[] names = dir.list();
for(String name:names){
ta.append(name+"\r\n");
}
}else{
String message = "您输入的信息:"+dirPath+",不存在,请重输!";
final Dialog d = new Dialog(f,"提示信息",true);
Label lb=new Label(message);
Button okBut = new Button("确定");
d.add(lb);
d.add(okBut);
d.setBounds(400, 200, 240, 150);
d.setLayout(new FlowLayout());
//对框框添加监听器
d.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
d.setVisible(false);
}
});
//对话框上的按钮添加监听器
okBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
d.setVisible(false);
}
});
//回车键起作用
okBut.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER){
d.setVisible(false);
}
}
});
d.setVisible(true);
}
tf.setText("");
}
public static void main(String[] args) {
new MyWindowDemo();
}
}
五,实现简单的记事本功能--运用到了打开文件对话框、保存文件对话框,还有菜单的使用。
menu是menuItem的子类,menu有一个add()方法参数是MenuItem,所以menu可以添加menuItem,也可以添加menu。要想有子菜单的话,那么,menu需要添加menu,然后再在menu上添加menuItem。
package GUI;
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.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MyMenuDemo {
/**
* 菜单:实现简单的记事本功能
*/
private Frame f;
private MenuBar mb;
private Menu m,subMenu;
private MenuItem openItem,saveItem,closeItem,subItem;
private TextArea ta;
private File file;
MyMenuDemo(){
init();
}
public void init(){
f=new Frame("My Note");
f.setBounds(300,100,500,400);
// f.setLayout(new FlowLayout());
mb=new MenuBar();
m=new Menu("File");
subMenu=new Menu("subMenu");
openItem = new MenuItem("open");
saveItem = new MenuItem("save");
closeItem=new MenuItem("exit");
subItem = new MenuItem("subItem");
ta=new TextArea();
subMenu.add(subItem);
m.add(openItem);
m.add(saveItem);
m.add(subMenu);//menu添加menu,menu是menuItem的子类
m.add(closeItem);//menu添加menuItem
mb.add(m);
f.setMenuBar(mb);//往frame里添加菜单条使用setMenuBar方法,而不是add方法
f.add(ta);//在菜单条下面添加一个文本框
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//打开对话框
openItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
FileDialog openDialog = new FileDialog(f,"open",FileDialog.LOAD);
openDialog.setVisible(true);
String filePath = openDialog.getDirectory();
String fileName = openDialog.getFile();
//获取目录或文件失败的处理
if(filePath==null||fileName==null)
return;
f.setTitle(f.getTitle()+"^o^"+filePath+fileName);
ta.setText("");
// File file =new File(filePath,fileName);
file =new File(filePath,fileName);
BufferedReader br;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while((line=br.readLine())!=null){
ta.append(line+"\r\n");
}
br.close();
} catch (IOException e1) {
throw new RuntimeException("读取失败");
}
}
});
//保存对话框,要考虑是否弹出
saveItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(file==null){
FileDialog saveDialog = new FileDialog(f,"save",FileDialog.SAVE);
saveDialog.setVisible(true);
String filePath = saveDialog.getDirectory();
String fileName = saveDialog.getFile();
//获取目录或文件失败的处理
if(filePath==null||fileName==null)
return;
f.setTitle(f.getTitle()+"^o^"+filePath+fileName);
file =new File(filePath,fileName);
}
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
String content = ta.getText();
bw.write(content);
bw.close();
} catch (IOException e1) {
throw new RuntimeException("写入失败");
}
}
});
//菜单项退出系统
closeItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new MyMenuDemo();
}
}