GUI
之前一直在命令行中操作,用命令行操作不直观,还需要记住很多命令,很不方便,接下来我们就用图形界面的方式来操作
GUI(Graphical User Interface):图形用户接口
Java为GUI提供的对象都存在Awt和Swing包中
Awt:调用本地系统方法实现功能,属于重量级控件
Swing:在Awt的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由JAVA实现,增强了移植性,属于轻量级控件。
下面我们来看一下图形用户界面组件的基本体系
Component
|--Button
|--Lable
|--Checkbox
|--TextComponent
|--TextArea
|--TextField
|--Container //这是一个容器,是一个特殊的组件,可以通过add方法将其他的组 件添加进来。
|--Window
|--Frame
|--Dialog
|--FileDialog
|--Panel
了解了组件,那么这些组件应该按照什么样的方式来排放呢?接下来来看一下布局管理器
常见的布局管理器:
FlowLayout(流式布局管理器,也是Panel的默认布局)
BorderLayout(边界布局管理器,Frame的默认布局)
GridLayout(网格布局管理器)
CardLayout(卡片布局管理器)
GridbagLayout(网个包布局管理器)
组件介绍的差不多了,可是这些组件制作的图形界面没有意义,因为组件没有任何事件,所以我们要对界面添加效果,这里就得用到事件监听机制。
什么是事件监听机制呢?也就是当我们创建了一些组件后,当我们某些动作作用在组件上的时候,会有某些事件产生,这就是事件监听机制,比如点击按钮就会弹出对话框。
事件监听机制的特点:
1,事件源(组件)
2,事件(每个事件源都有自己的对应事件和共性事件)
3,监听器(可以触发某一事件的动作)
*以上3点JAVA都已经帮我们封装好了我们需要做的是第四点:事件处理
4,事件处理
说完了组件和事件监听机制,下面用实例来深入了解组件和事件监听机制
import java.awt.*;
import java.awt.event.*;
public class FrameDemo {
private Frame f;
private Button b;
FrameDemo(){
init();
}
public void init(){
f = new Frame("my Fram");
b = new Button("exit");
f.setBounds(350, 200, 500, 400);
f.setVisible(true);//让窗口可见
MyEvent();
f.setLayout(new FlowLayout());
f.add(b);
}
private void MyEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new FrameDemo();
}
}
补充:WindowAdapter(); 因为要用WindowListener中的方法必须实现其中的7个方法,很多余,所以java中WindowAdapter已经实现了WindowListener接口,并覆盖了所有方法,那么我们只要继承WindowAdapter覆盖需要用的方法即可。
之前学习IO的时候我们演示了列出文件目录的示例,下面我们就通过图形用户界面将文件目录输出到图形用户界面上
//列出目录中的文件,输入的路劲错误时需要报错
package GUI;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
public class GUIText {
private Frame f;
private Button b;
private TextArea ta;
private TextField tf;
private Dialog d;
private Label lab;
private Button okBut;
GUIText(){
init();
}
public void init(){
f=new Frame("我的转换器");
f.setBounds(350, 200, 500, 400);
f.setLayout(new FlowLayout());
b=new Button("转到");
ta=new TextArea(18, 55);
tf=new TextField(48);
f.add(tf);
f.add(b);
f.add(ta);
d = new Dialog(f,"提示",true);
lab = new Label();
okBut = new Button("确定");
d.setLayout(new FlowLayout());
d.setBounds(400, 260, 230, 130);
d.add(lab);
d.add(okBut);
myEvent();
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showFile();
}
});
d.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
d.setVisible(false);
}
});
okBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
d.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showFile();
}
});
}
private void showFile(){
String dirName = tf.getText();
File f = new File(dirName);
if(f.exists()&&f.isDirectory()){
ta.setText("");
String[] names = f.list();
for(String name : names){
ta.append(name+"\r\n");
}
}
else{
String info = "您输入的路劲错误,请重新输入!";
lab.setText(info);
d.setVisible(true);
}
tf.setText("");
}
public static void main(String[] args) {
new GUIText();
}
}
菜单
图形用户界面不仅仅只有组件,还有菜单,接下来就来看一下菜单的制作以及菜单的事件监听机制。
MenuBar(菜单栏)
Menu(菜单)
MenuItem(子菜单)
菜单的制作还是比较简单的,只要大家理清菜单跟子菜单的关系即可,同时菜单也需要事件监听机制,原理跟组件的是一样的。
接下来就通过一个山寨版记事本程序来演示一下菜单以及菜单的事件监听机制
//制作一个简单的记事本程序,需要有打开和保存以及退出功能
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MyMenuDemo {
private Frame f;
private TextArea ta;
private File file;
private FileDialog fOpen,fSave;
private MenuBar mb;
private Menu fileMenu;
private MenuItem open,save,close;
MyMenuDemo(){
init();
}
public void init(){
f = new Frame("我的记事本");
f.setBounds(350, 200, 500, 400);
ta = new TextArea();
fOpen = new FileDialog(f,"打开文件",FileDialog.LOAD);//打开文件窗口
fSave = new FileDialog(f,"保存文件",FileDialog.SAVE);//保存文件窗口
mb = new MenuBar();
fileMenu = new Menu("文件");
open = new MenuItem("打开");
save = new MenuItem("保存");
close = new MenuItem("退出");
fileMenu.add(open);
fileMenu.add(save);
fileMenu.add(close);
mb.add(fileMenu);
f.setMenuBar(mb);
f.add(ta);
MyEvent();
f.setVisible(true);
}
private void MyEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
open.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fOpen.setVisible(true);
String path = fOpen.getDirectory();
String fileName = fOpen.getFile();
if(fileName==null||fileName==null)
return;
ta.setText("");
file = new File(path,fileName);
try {
BufferedReader br =
new BufferedReader(new FileReader(file));
String buf = null;
while((buf=br.readLine())!=null){
ta.append(buf+"\r\n");
}
br.close();
} catch (IOException e1) {
throw new RuntimeException("读取失败");
}
}
});
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(file==null){
fSave.setVisible(true);
String path = fSave.getDirectory();
String fileName = fSave.getFile();
if(fileName==null||fileName==null)
return;
file = new File(path,fileName);
}
try{
BufferedWriter bufr = new BufferedWriter(new FileWriter(file));
String text = ta.getText();
bufr.write(text);
// bufr.flush();
bufr.close();
}catch(IOException ex){
throw new RuntimeException("cuole");
}
}
});
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new MyMenuDemo();
}
}