GUI(图形用户界面)
GUI
- Graphical User Interface(图形用户接口)。
- 用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI
- Command line User Interface (命令行用户接口)
就是常见的Dos命令行操作。
需要记忆一些常用的命令,操作不直观。
举例:
比如:创建文件夹,或者删除文件夹等
Java为GUI提供的对象都存在java.awt和javax.swing两个包中
Awt与 Swing
java.awt:
Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
javax.swing:
在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
布局管理器
容器中的组件的排放方式,就是布局。
常见的布局管理器:
FlowLayout(流式布局管理器)
- 从左到右的顺序排列。
- Panel默认的布局管理器。
BorderLayout(边界布局管理器)
- 东,南,西,北,中
- Frame默认的布局管理器。
GridLayout(网格布局管理器)
- 规则的矩阵
CardLayout(卡片布局管理器)
- 选项卡
GridBagLayout(网格包布局管理器)
- 非规则的矩阵
建立一个简单的窗体
- Container常用子类:Window Panel(面板,不能单独存在。)
- Window常用子类:Frame Dialog
- 简单的窗体创建过程:
Frame f = new Frame(“my window”);
f.setLayout(new FlowLayout());
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体出现在屏幕的位置
f.setVisible(true);//显示窗体
事件监听机制组成
- 事件源(组件)
- 事件(Event)
- 监听器(Listener)
- 事件处理(引发事件后处理方式)
事件监听机制流程图
事件监听机制
- 确定事件源(容器或组件)
- 通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
- 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
- 一般用匿名内部类来表示。
- 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
- 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
例程
- 通过按钮关闭窗体。
- 在窗体中通过按钮创建按钮。
- 熟悉键盘事件与鼠标事件
代码实现
FrameDemo
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class FrameDemo {
/**
* @param args
*/
public static void main(String[] args) {
//1,创建一个窗体。Frame
Frame f = new Frame("my frame");
//2, 对窗体进行基本设置。
f.setSize(500, 400);
f.setLocation(400, 200);
//设置布局。
f.setLayout(new FlowLayout());
//给窗体添加组件。
Button but = new Button("my button");
//加入一个文本框组件。
TextField tf = new TextField(40);
//将组件添加到窗体中。
f.add(tf);
f.add(but);
/*
* 需求:想要点击按钮有效果,比如打印一句话。
* 思路:
* 1,确定事件源。按钮。
* 2,确定监听器。按钮添加监听器,按钮对象最清楚。到按钮对象中查找。
* 3,定义处理方式。
*
* 定义的规范:XXXLinstener:XXX监听器。 --对应的XXXEvent事件。
*/
//1,在按钮上添加所需的监听器。
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("按钮被触发了....."+e);
// System.exit(0);
/*
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("*");
}
System.out.println();
}*/
}
});
/*
* 需求:想要实现点击窗体X就可以实现窗体的关闭。
* 思路:
* 1,事件源:窗体。
* 2,监听器。通过窗口对象去查。
* 3,事件处理。
*
* 到底哪些监听接口有适配器类?
* 只要监听接口的中的方法在2个以内,都没有适配器类。适配器的出现只为方便创建监听器对象。
* 但是一般监听接口都有适配器。
*
*/
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("window closing");
System.exit(0);
}
@Override
public void windowOpened(WindowEvent e) {
System.out.println("孔雀开屏!window open");
}
});
/*
* 演示鼠标监听。
*
* 按钮事件源。
* 鼠标监听器注册到按钮上。
*
*
* 组件.addXXXListener(new XXXAdapter()
* {
* public void methodName(XXXEvent e){}
* }));
*
*/
but.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
/*
* 想要对鼠标双击进行处理。应该找鼠标事件对象。因为事件对象一产生,内部必然封装事件源以及事件相关内容。
* 要查MouseEvent对象。
*/
if(e.getClickCount() == 2){
System.out.println("mouse double click");
}
}
});
/*
* 需求:文本框中只能输入数字。
* 事件源:文本框。
* 文本框注册键盘监听。
* 事件处理
*/
tf.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//1,如何获取录入的内容。通过键盘事件对象获取。
// char key = e.getKeyChar();
// int code = e.getKeyCode();
// System.out.println(code+"...."+KeyEvent.getKeyText(code));
// int code = e.getKeyCode();
// if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)){
// System.out.println("必须是0-9数字");
// e.consume();//直接取消默认处理方式。
// }
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER){
System.out.println("ctrl+enter run");
}
}
});
//3,让窗体显示。
f.setVisible(true);
System.out.println("over");
}
}
MyWindow
package cn.itcast.swing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class MyWindow extends javax.swing.JFrame {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
private JButton jButton1;
private JTextArea jTextArea1;
private JScrollPane jScrollPane1;
private JTextField jTextField1;
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyWindow inst = new MyWindow();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public MyWindow() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
{
jButton1 = new JButton();
getContentPane().add(jButton1);
jButton1.setText("\u786e\u5b9a");
jButton1.setBounds(466, 21, 128, 50);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
}
{
jTextField1 = new JTextField();
getContentPane().add(jTextField1);
jTextField1.setBounds(17, 21, 437, 50);
jTextField1.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent evt) {
jTextField1KeyPressed(evt);
}
});
}
{
jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(17, 83, 577, 272);
{
jTextArea1 = new JTextArea();
jScrollPane1.setViewportView(jTextArea1);
}
}
pack();
this.setSize(626, 401);
} catch (Exception e) {
//add your error handling code here
e.printStackTrace();
}
}
private void jButton1ActionPerformed(ActionEvent evt) {
showDir();
}
private void showDir() {
//通过在文本框输入具体的目录,将目录中的当前文件或者文件夹的名称列出到文本区域中。
/*
* 思路:
* 1,获取文本框中的路径。
* 2,将路径封装成File对象。list();
* 3,将list()列表中的内容展现在文本区域中。
*/
//1,获取路径。通过文本框对象完成。
String str_dir = jTextField1.getText();
//2,将字符串路径封装成File对象。
File dir = new File(str_dir);
//判断。
if(dir.exists()&&dir.isDirectory()){
//清空文本区域。
jTextArea1.setText("");
//3,获取文件名称列表。
String[] names = dir.list();
for(String name :names){
//4,将名字显示到文本区域。
jTextArea1.append(name+LINE_SEPARATOR);
}
}
}
private void jTextField1KeyPressed(KeyEvent evt) {
if(evt.getKeyCode()==KeyEvent.VK_ENTER){
showDir();
}
}
}