------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员—GUI(图形用户界面)
GUI
Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI
Command line User Interface (命令行用户接口)
就是常见的 Dos 命令行操作。
需要记忆一些常用的命令,操作不直观。
举例:
比如:创建文件夹,或者删除文件夹等
Java 为 GUI 提供的对象都存在 java.Awt 和 javax.Swing 两个包中。
Act 和 Swing
Awt 与 Swing
java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属
重量级控件。
javax.Swing:在 AWT 的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且
完全由 Java 实现。增强了移植性,属轻量级控件。
2、布局管理器
3、事件监听机制组成容器中的组件的排放方式,就是布局。
常见的布局管理器:
FlowLayout(流式布局管理器)//目前最常用的
从左到右的顺序排列。
Panel 默认的布局管理器。
BorderLayout(边界布局管理器)
东,南,西,北,中
Frame 默认的布局管理器。
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridBagLayout(网格包布局管理器)
非规则的矩阵
使用方法:new frame().setLayout(new FlowLayout());
创建图形化界面:
1,创建 frame 窗体。
2,对窗体进行基本设置。
比如大小,位置,布局。
3,定义组件。
4,将组件通过窗体的 add 方法添加到窗体中。
5,让窗体显示,通过 setVisible(true)
Eg:一个简单的窗体
事件源(组件)
事件(Event)
监听器(Listener)
事件处理(引发事件后处理方式)
事件监听机制流程图
3、事件监听机制组成<span style="font-size:18px;">import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class SwingDemo
{
public static void main(String[] args)
{
JFrame f = new JFrame();
f.setBounds(300,100,500,400);
f.setLayout(new FlowLayout());
JButton but = new JButton("我是一个按钮");
f.add(but);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
f.setVisible(true);
}
}</span>
事件源(组件)
事件(Event)
监听器(Listener)
事件处理(引发事件后处理方式)
事件监听机制流程图
务必记牢:
确定事件源(容器或组件)
通过事件源对象的 addXXXListener()方法将侦听器注册到该事件源上。
该方法中接收 XXXListener 的子类对象,或者 XXXListener 的子类 XXXAdapter 的子类对
象。
一般用匿名内部类来表示。
在覆盖方法的时候,方法的参数一般是 XXXEvent 类型的变量接收。
事件触发后会把事件打包成对象传递给该变量。 (其中包括事件源对象。通过 getSource()
或者,getComponent()获取。 )
事件源:就是 awt 包或者 swing 包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
以上三者,在 java 中都已经定义好了。直接获取其对象来用就可以了。
我们要做的事情是,就是对产生的动作进行处理
Eg:
package june610;
import java.awt.*;
class MyWin extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.out.println("hahahha");
System.exit(0);
}
}
public class FrameDemo {
//如果写成内部类的形式那么前面必须加上publicstatic,因为主方法是静态的,不能调用动态类或者方法
public static void main(String[] args) {
//设置窗体
Frame f = new Frame("窗体");
f.setSize(400, 300);
f.setLocation(500, 300);//距离左侧,距离上面
/**可以用这个方法一次性设置
* setBounds(int x, int y, int width, int height) 移动组件并调
整其大小。
*/
Button b = new Button("按钮");
Button b2 = new Button("按钮2");
TextField tf = new TextField(20);
f.add(b);//把按钮添加到窗体上
f.add(b2);//把按钮添加到窗体上
f.add(tf);//在窗体上的的顺序按照添加的顺序
f.setLayout(new FlowLayout());//设置容器的布局管理器
//f.addWindowListener(new MyWin());
b.addActionListener(new ActionListener(){
//通过匿名内部类,方便添加动作监听器
public void actionPerformed(ActionEvent e) {
System.out.println("按钮把界面关闭了");
//System.exit(0);
}
});
//鼠标
b.addMouseListener(new MouseAdapter() {//鼠标动作监听器
int count = 1;
public void mouseEntered(MouseEvent e){
System.out.println("鼠标进入"+(count++)+"次!");
}
});
b.addMouseListener(new MouseAdapter(){//和上面的一样,可以写在一起
int clickCount = 1;
public void mouseClicked(MouseEvent e){
if(e.getClickCount() == 2){
System.out.println("双击动作"+clickCount++);
}
}
});
/*
f.addWindowListener(new WindowAdapter()//匿名内部类的写法
{
public void windowClosing(WindowEvent e)
{
System.out.println("我关");
System.exit(0);
}
public void windowActivated(WindowEvent e)
{
System.out.println("我活了。");
}
public void windowOpened(WindowEvent e)
{
System.out.println("我被打开了,hahahhahah");
}
});*/
//键盘:
b2.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e)
{
System.out.println("键盘的作用");//用鼠标按没反应,
System.out.println(e.getKeyChar()+"---"+e.getKeyCode());//f---70等、
if(e.getKeyCode() == 27){//按住esc键退出
System.out.println("ESC键把我关闭了!");
System.exit(0);
}
//组合键去关闭 CTRL + ENTER
if(e.isControlDown() && e.getKeyCode() ==
KeyEvent.VK_ENTER){
System.out.println("CTRL + ENTER组合键把我关闭了!");
System.exit(0);
}
}
});
//文本框
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
if(!(e.getKeyCode()>=KeyEvent.VK_0 &&
e.getKeyCode()<=KeyEvent.VK_9)){
System.out.println(e.getKeyChar()+"不符合是数字! ");
}
}
});
f.setVisible(true);//设置可见性
}
}