图形化界面
1. GUI:Graphical User Interface,图形化用户接口
CLI:Command Line User Interface,命令行用户接口区别:CLI需要记住一些命令,如果忘记了命令则很痛苦,而GUI则操作比较直观、方便;
2.java.Awt和javax.Swing的区别:
java.Awt:抽象窗口工具包,需要本地系统方法实现,不易移植;
javax.Swing:在Awt基础之上,完全由java实现,增强移植性。
3.继承体系:Component组件
|--Container:容器,可以添加其它基本组件;
|--Window
|--Frame:窗体
|--Dialog:对话框
|--FileDialog:文本框对话框
|--Panel:面板
|--基本组件
|--Button:按钮
|--Lable:标签
|--CheckText:复选框
|--TextComponent:文本组件
|--TextField:文本框,单行文本
|--TextArea:文本域,多行文本
4.布局管理器:
布局:容器中组件的排放方式。
常见的布局管理器:
FlowLayout:流式布局,从左到右,默认居中,Panel的默认布局;
BorderLayout:边界式布局,东南西北中,Frame的默认布局;
GirdLayout:网格式布局,存放在网格中,如计算器;
GirdBagLayout:网格包式布局,不规则的矩阵。
还有一种坐标式布局,随意放。
若有多种布局,则添加Panel组件,将其他组件添加到Panel中,再将Panel按流式布局。
5.创建组件演示,以Frame为例。
Frame f=new Frame();//创建窗体对象;
f.setTitle("我的窗体");//设置窗体名称
f.setSize(100,200);//设置窗体的长为100,宽为200;
f.setLocation(400,300);//设置窗体的顶点距左边界400,距上边界300;
f.setBounds(100,20,400,300);//这句话将第二句和第三句合并,一个意思;
f.setVisiable(true);//设置窗体可见
注意:开启了图形化界面后,多了线程。
6.事件监听机制:
事件源:发生事件的组件对象,即awt包或者swing包中的那些图形界面组件;
事件:每一个事件源都有自己的对应事件和共性事件;
事件监听:对可能发生的事情的多个情况(动作)的封装对象到了监听器中,一般是个接口;
事情处理:重写事件监听里面的功能。
7.GUI窗体事件
WindowListener:监听器
注册监听器:1.匿名对象:用一个子类去实现接口,然后传递一个子类匿名对象即可;
2.匿名内部类:定义一个匿名内部类重写接口中的方法;
f.addWindowListener(new WindowLisener());
这种采用的是直接添加事件监听器接口,但太麻烦,因为可能我们只需要实现其中一两个事件,而它要求我们全部实现,
所以,这种方式不可取;后来,出现了事件监听器的适配器,这个去实现事件监听器接口,提供了空实现,在完成事件是,在那
个里面完成某个功能,就重写某个方法即可,不需要全部实现。
注意:不是所有的事件都有适配器的,如果方法较少是,不需要适配器。
8.代码改进:封装Frame,在main中调用方法;需求如图:将文本框中的内容通过点击转到按钮输出文本域中
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test1 {
public static void main(String[] args) {
FrameTest f=new FrameTest();
}
}
class FrameTest{
private Frame f;
private TextField tf;
private Button bu;
private TextArea ta;
public FrameTest() {
init();
}
private void init() {
f=new Frame();//创建窗体
f.setBounds(400, 300, 400, 300);//设置窗体属性
tf=new TextField(20);//创建一个文本框
ta=new TextArea(10,40);//创建一个文本域
bu=new Button("转到");//创建按钮
//添加组件到窗体
f.add(tf);
f.add(ta);
f.add(bu);
//添加事件
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
bu.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//获取文本框的值
String s=tf.getText();
//清空文本框
tf.setText("");
//将获得值写入到文本域中,追加并换行
ta.append(s+System.getProperty("line.separator"));
}
});
}
}
9.菜单继承体系:
MenuComponent:菜单组件
|--MenuBar:菜单栏
|--MenuItem:菜单项
|--Menu:菜单
FileDialog:文件对话框
getDictionary():获取目录;
getFile():获取对话框中选定的文件;
setMode(status):设置文件对话框LOAD和SAVE模式。
10.我的菜单栏案例
MenuBar
文件(Menu)
|--更改标题(Menu)
|--好好学习(MenuItem)
|--天天向上(MenuItem)
|--恢复标题(MenuItem)
|--退出系统(MenuItem)
|--打开记事本 Runtime(MenuItem)
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) {
MenuTest mt=new MenuTest();
}
}
class MenuTest{
private Frame f;
private MenuBar mb;
private Menu m1,m2;
private MenuItem mi1,mi2,mi3,mi4,mi5;
protected String OldTitle;
public MenuTest() {
init();
OldTitle=f.getTitle();
}
private void init() {
f=new Frame();
f.setTitle("我的菜单案例");
f.setBounds(400,300,400,400);
//创建菜单组件
mb=new MenuBar();
m1=new Menu("文件");
m2=new Menu("更改标题");
mi1=new MenuItem("好好学习");
mi2=new MenuItem("天天向上");
mi3=new MenuItem("退出系统");
mi4=new MenuItem("打开记事本");
mi5=new MenuItem("恢复标题");
//谁添加谁
m2.add(mi1);
m2.add(mi2);
m2.add(mi5);
m1.add(m2);
m1.add(mi3);
m1.add(mi4);
mb.add(m1);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
exit();
}
});
mi1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String s=mi1.getLabel();
changeTitle(s);
}
});
mi2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String s=mi2.getLabel();
changeTitle(s);
}
});
mi3.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
exit();
}
});
mi4.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Runtime r=Runtime.getRuntime();
try {
r.exec("notepad.exe");
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
mi5.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
changeTitle(OldTitle);
}
});
}
//封装修改标题的方法
protected void changeTitle(String s) {
f.setTitle(s);
}
//封装退出方法
private void exit() {
System.exit(0);
}
}