JAVA 基础GUI
一、基本概念
1)GUI:图形用户界面
Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
2)CLI:
Command line User Interface(命令行用户接口)。
就是常见的 Dos 命令操作。
需要记忆一些常用的命令,操作不直观。
举例:比如创建文件夹,或者删除文件夹等操作。
3)Awt 与 Swing
Java 为 GUI 提供的对象都存在 java.Awt 和 javax.Swing 两个包中。
|--Awt 与 Swing
|--java.Awt:Abctract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属于重量级控件。
|--javax.Swing:在 AWT 的基础上,建立的一套图形用户界面,其中提供了更多的组件,而且完全。由 java 实现。增强了移植性,属于轻量级控件。
|-->Component:组件
|--|-->Container:容器
|--|-->Window:窗口
|--|--|-->Frame:框架
|--|--|-->Dialog:对话框
|--|--|--|-->FileDialog:文件对话框
|--|-->Panel:面板容器
|--|-->Button:按钮
|--|-->Label:标签
|--|-->CheckBox:复选框
|--|-->TextComponent:文本组件
|--|--|-->TextArea:文本
|--|--|-->TextField:文本框
重点:Container不同于其它组件,作为一个组件,还可以往里面添加其它组件。通过 add 的方法实现。
Component的继承关系图例:
二、布局管理器:
1、容器中的组件的排放方式,就是布局。
2、常见的布局管理器:
|--FlowLayout(流式布局管理器)
|--|--从左到右的顺序排列。
|--|--Panel 默认的布局方式。
|--BorderLayout(边界布局管理器)
|--|--东西南北中
|--|--Frame 默认的布局管理器
|--GridLayout(网格布局管理器)
|--|--规则的矩阵
|--CardLayout(卡片布局管理器)
|--|--选项卡
|--GridBagLayout(网格包布局管理器)
|--|--非规则的矩阵
3、事件监听机制:
事件源(组件):就是 awt 包或者 swing 包中的那些图形界面组件。
事件(Event):每一个事件源都有自己特有的对应事件和共性事件。
监听器(Listener):将可以触发某一个事件的动作(不止一个动作),都已经封装到了监听器中。
以上三者,在java 中都已经定义好了,直接获取其对象来用就可以了。那么,我们要做的事情就是对产生的动作进行处理。就是事件处理(引发事件后的处理方式)。
4、创建图形化界面的基本步骤
1)创建 Frame 窗体。
2)对窗体进行基本设置。比如:大小,位置,布局。
3)定义组件。
4)将组件通过窗体的 add 方法添加到窗体中。
5)窗体显示,通过 setVisible(true)显示。
5、AwtDemoCode:
package study.part2.day017.guistudy;
import java.awt.*;
import java.awt.event.*;
public class AwtDemoAction {
public static void main(String[] args) {
FrameDemo fd = new FrameDemo();
}
}
class FrameDemo{
//定义该图形中所需要的组件的引用
private Frame f;
private Button btn;
private TextField tf;
FrameDemo(){
init();
}
public void init(){
f = new Frame("my frame");
//对frame 进行基本设置
f.setBounds(100, 100, 400, 250);
f.setLayout(new FlowLayout());
btn = new Button("my btn");
tf = new TextField(30);
//将组件添加到组件中,组件的添加顺序觉得了排列顺序
f.add(btn);
f.add(tf);
//显示窗体
myEvent();
//f.addWindowListener(new WindowAdapter());
f.setVisible(true);
}
//单独的事件添加方法
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//让按钮具备退出程序的功能
/**
* 按钮就是事件源,
* 那么选择哪个监听器呢?
* 通过关闭窗体示例,来了解到想要知道,哪个组件具备什么样的特有监听器。
* 需要查看该组件对象的功能。
* addActionLintener
* 用匿名内部类的方法实现。
*/
btn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("这是按钮干的。");
//System.exit(0);
}
});
/**
* 移动到鼠标时的事件
*/
btn.addMouseListener(new MouseAdapter(){
private int count =1;
private int clickCount = 1;
public void mouseEntered(MouseEvent e){
System.out.println("鼠标进入"+count++);
}
public void mouseClicked(MouseEvent e){
//因为api中没有提供双击事件,所有要自己设置,通过判断获取的点击次数来实现
if(e.getClickCount()==2){
System.out.println("双击了。"+clickCount++);
}
//System.out.println("click"+clickCount++);
}
});
//给 btn 添加键盘监听
btn.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent ke){
/**
//27是 ESC 键的值,可以直接==27就能退出,也可以用
if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
System.exit(0);
}
//比如输入:a 对应的编码值:65
System.out.println(ke.getKeyChar()+"..."+ke.getKeyCode());
//--------------------------------------------------------
System.out.println(ke.getKeyText(ke.getKeyCode())+"..."+ke.getKeyChar());
*/
//ctrl+enter 的方法
if(ke.isControlDown()&&ke.getKeyCode()==KeyEvent.VK_ENTER){
System.out.println("同时按下ctrl和回车键");
}
}
});
//文本框监听:限制输入的内容为0-9
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int code = e.getKeyCode();
if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)){
System.out.println(code+"--是非法的。程序退出。");
//禁止输入,屏蔽键盘
e.consume();
//System.exit(0);
}
}
});
}
}
运行结果:
6、菜单栏的使用示例
Code:
package study.part2.day017.guistudy;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
public class MyWindowDemoTest {
public static void main(String[] args) {
MyWindowDemo mwd = new MyWindowDemo();
}
}
class MyWindowDemo extends Frame{
private static final long serialVersionUID = 1L;
private Frame f; //框架
private Button btn; //按钮
private Button okBtn; //确认按钮
private TextField tf; //文本输入框
private TextArea ta; //文本域
private Dialog d; //对话框
private Label lab; //文本
MyWindowDemo(){
init();
}
private void init(){
f = new Frame("My");
f.setBounds(100, 100, 500, 400);
f.setLayout(new FlowLayout());
tf = new TextField(20);
btn = new Button("存入");
ta = new TextArea(14,30);
//对话框的初始化和添加内容
d = new Dialog(f,"提示信息!",false);
d.setBounds(200, 200, 300, 200);
d.setLayout(new FlowLayout());
lab = new Label();
okBtn = new Button("OK。");
d.add(lab);
d.add(okBtn);
f.add(tf);
f.add(btn);
f.add(ta);
myEvent();
f.setVisible(true);
}
//单独的事件添加方法
public void myEvent(){
//给窗体添加监听器,使用匿名内部类实现
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("退出。");
System.exit(0);
}
});
//添加鼠标动作
btn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
showDir();
/**
//初始化一个字符串对象,存入地址信息
String dirPath = tf.getText();
//把获取的地址信息传递给 File
File dir = new File(dirPath);
//判断初始化的 File 是否是文件目录,是否存在
if(dir.exists() && dir.isDirectory()){
//定义一个字符串数组,接收该文件目录里面的文件列表
String[] names = dir.list();
//使用高级 for 循环遍历字符串数组
for(String name : names){
System.out.println("文件名是:"+name);
//把遍历后的文件名存入 TextArea 中,结果发现,只是把文件目录中
//的最后一个文件写入了,这种方法是适合写入一次数据
//ta.setText("文件名是:"+name);
//append() 方法的使用就类式与 StringBuilder的 append 用法
ta.append("文件名:"+name+"\r\n");
}
//清空输入框
tf.setText("");
}
//否则,弹出对话框
else{
//把错误信息加载到对话框中
String info = "【"+tf.getText()+"】"+"输入有误,请重新输入。";
lab.setText(info);
d.setVisible(true);
}
*/
/**
//获取输入的文本
String text = tf.getText();
//把输入的文本添加到 TextArea 中
ta.setText(text);
//清空 TextField
tf.setText("");
System.out.println("输入内容:"+text);
*/
}
});
//添加鼠标监听器
btn.addMouseListener(new MouseAdapter(){
private int clickCount = 1;
//鼠标单击和双击
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
System.out.println("触发双击事件。");
}else{
System.out.println("单击了"+(clickCount++)+"次");
}
}
});
//添加 Dialog 对话框的事件
d.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
d.setVisible(false);
}
});
okBtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
d.setVisible(false);
}
});
//给 TextField 添加键盘点击事件
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
//如果键盘点击了 enter 键
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});
}
private void showDir(){
//初始化一个字符串对象,存入地址信息
String dirPath = tf.getText();
//把获取的地址信息传递给 File
File dir = new File(dirPath);
//判断初始化的 File 是否是文件目录,是否存在
if(dir.exists() && dir.isDirectory()){
//先情况ta
ta.setText("");
//定义一个字符串数组,接收该文件目录里面的文件列表
String[] names = dir.list();
//使用高级 for 循环遍历字符串数组
for(String name : names){
System.out.println("文件名是:"+name);
//把遍历后的文件名存入 TextArea 中,结果发现,只是把文件目录中
//的最后一个文件写入了,这种方法是适合写入一次数据
//ta.setText("文件名是:"+name);
//append() 方法的使用就类式与 StringBuilder的 append 用法
ta.append("文件名:"+name+"\r\n");
}
//清空输入框
tf.setText("");
}
//否则,弹出对话框
else{
//把错误信息加载到对话框中
String info = "【"+tf.getText()+"】"+"输入有误,请重新输入。";
lab.setText(info);
d.setVisible(true);
}
}
}
运行结果: