No_16_0314 Java基础学习第十七天
来源:互联网 发布:网吧充值软件 编辑:程序博客网 时间:2024/05/22 14:17
- 第十一章 GUI 图形界面编程
- GUI图形用户界面概述
- awt和swing包的概述
- GUI继承体系图
- GUI第一个案例
- 事件监听机制
- 事件监听机制流程
- 适配器设计模式
- 窗体布局
- 流式布局FlowLayout
- 边界布局
- 卡片布局
- 网格布局
- 网格包布局
- GUI案例
- 菜单组件
- 菜单组件概述
- Netbeans工具的概述和基本使用
- 模拟四则运算基本框架
- 四则运算添加图标
- 四则运算设置窗体居中
- 修改皮肤
- 对四则运算加入校验
- 如何让Netbeans的东西Eclipse能访问
- 成员变量的重构
- 第十一章 GUI 图形界面编程
第十一章 GUI 图形界面编程
GUI(图形用户界面)概述
- GUI
- Graphical User Interface(图形用户接口)。
- 用图形的方式,来显示计算机操作的界面,这样更方便更直观。
- CLI
- Command line User Interface (命令行用户接口)
- 就是常见的Dos命令行操作。
- 需要记忆一些常用的命令,操作不直观。
- 举例:
- 比如:创建文件夹,或者删除文件夹等
awt和swing包的概述
- java.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属
重量级控件
(移植性差)。 - javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属
轻量级控件
(移植性强)。
GUI继承体系图
- 组件:组件就是对象
- 容器组件:是可以存储基本组件和容器组件的组件。
- 基本组件:是可以使用的组件,但是必须依赖容器。
- TextField :单行多列文本框(eg:用户名输入框)
- TextArea : 多行多列文本域(eg:个人介绍框)
- Window:没有边界和菜单栏的顶层窗口
- Frame:带有标题和边框的顶层窗口
GUI第一个案例
- Container常用子类:Window Panel(面板,不能单独存在。)
- Window常用子类:Frame Dialog
简单的窗体创建过程:
- Frame f = new Frame(“my window”);
- f.setLayout(new FlowLayout());
- f.setSize(300,400);//设置窗体大小
- f.setLocation(300,200);//设置窗体出现在屏幕的位置
- f.setVisible(true);
第一个案例优化
import java.awt.Dimension;import java.awt.Frame;import java.awt.Point;public class FrameDemo2 { public static void main(String[] args) { // 创建对象 Frame f = new Frame("方法调用的前后关系"); // f.setVisible(true); // try { // Thread.sleep(3000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // // f.setSize(400, 300); // // Dimension(int width, int height) // Dimension d = new Dimension(400, 300); // f.setSize(d); // // f.setLocation(400, 200); // // Point(int x, int y) // Point p = new Point(400, 200); // f.setLocation(p); // 一个方法搞定 f.setBounds(400, 200, 400, 300); f.setVisible(true); }}
事件监听机制:
- A:事件源 事件发生的地方
- B:事件 就是要发生的事情
- C:事件处理 就是针对发生的事情做出的处理方案
- D:事件监听 就是把事件源和事件关联起来
举例:人受伤事件。 事件源:人(具体的对象) Person p1 = new Person("张三"); Person p2 = new Person("李四"); 事件:受伤 interface 受伤接口 { 一拳(); 一脚(); 一板砖(); } 事件处理: 受伤处理类 implements 受伤接口 { 一拳(){ System.out.println("鼻子流血了,送到卫生间洗洗"); } 一脚(){ System.out.println("晕倒了,送到通风处"); } 一板砖(){ System.out.println("头破血流,送到太平间"); } } 事件监听: p1.注册监听(受伤接口)
事件监听机制流程
适配器设计模式
- 通过适配器设计模式改进窗口关闭案例
/* * 问题: * 接口(方法比较多) -- 实现类(仅仅使用一个,也得把其他的实现给提供了,哪怕是空实现) * 太麻烦了。 * 解决方案: * 接口(方法比较多) -- 适配器类(实现接口,仅仅空实现) -- 实现类(用哪个重写哪个) */public class UserDaoDemo { public static void main(String[] args) { UserDao ud = new UserDaoImpl(); ud.add(); // 我没有说我们需要四种功能都实现啊。 UserDao ud2 = new UserDaoImpl2(); ud2.add(); }}public abstract class UserAdapter implements UserDao { @Override public void add() { } @Override public void delete() { } @Override public void update() { } @Override public void find() { }}public class UserDaoImpl2 extends UserAdapter { @Override public void add() { System.out.println("添加功能"); }}
窗体布局
流式布局(FlowLayout)
边界布局
卡片布局
网格布局
网格包布局
GUI案例
- 窗体关闭事件
import java.awt.Frame;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class FrameDemo { public static void main(String[] args) { // 创建窗体对象 Frame f = new Frame("窗体关闭案例"); // 设置窗体属性 f.setBounds(400, 200, 400, 300); // 让窗体关闭 //事件源 //事件:对窗体的处理 //事件处理:关闭窗口(System.exit(0)); //事件监听// f.addWindowListener(new WindowListener() {// @Override// public void windowOpened(WindowEvent e) {// }// // @Override// public void windowIconified(WindowEvent e) {// }// // @Override// public void windowDeiconified(WindowEvent e) {// }// // @Override// public void windowDeactivated(WindowEvent e) {// }// // @Override// public void windowClosing(WindowEvent e) {// System.exit(0);// }// // @Override// public void windowClosed(WindowEvent e) {// }// // @Override// public void windowActivated(WindowEvent e) {// }// }); //用适配器类改进 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); // 设置窗体可见 f.setVisible(true); }}
- 按钮点击事件
import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/* * 需求:把按钮添加到窗体,并对按钮添加一个点击事件。 * A:创建窗体对象 * B:创建按钮对象 * C:把按钮添加到窗体 * D:窗体显示 */public class FrameDemo { public static void main(String[] args) { // 创建窗体对象 Frame f = new Frame("添加按钮"); // 设置属性 f.setBounds(400, 200, 400, 300); // 设置布局为流式布局 f.setLayout(new FlowLayout()); // 创建按钮对象 Button bu = new Button("点我啊"); // bu.setSize(20, 10); // 把按钮添加到窗体 f.add(bu); // 设置窗体可以关闭 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); bu.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("你再点试试"); } }); // 窗体显示 f.setVisible(true); }}
- 把数据通过文本框转移到文本域
import java.awt.Button;import java.awt.FlowLayout;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 FrameDemo { public static void main(String[] args) { // 创建窗体对象 Frame f = new Frame("数据转移"); // 设置窗体属性和布局 f.setBounds(400, 200, 400, 300); f.setLayout(new FlowLayout()); // 创建文本框 final TextField tf = new TextField(20); // 创建按钮 Button bu = new Button("数据转移"); // 创建文本域 final TextArea ta = new TextArea(10, 40); // 把组件添加到窗体 f.add(tf); f.add(bu); f.add(ta); // 设置窗体关闭 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); // 对按钮添加事件 bu.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 获取文本框的值 String tf_str = tf.getText().trim(); // 清空数据 tf.setText(""); // 设置给文本域 // ta.setText(tf_str); // 追加和换行 ta.append(tf_str + "\r\n"); //获取光标 tf.requestFocus(); } }); // 设置窗体显示 f.setVisible(true); }}
- 鼠标事件案例
import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class FrameDemo { public static void main(String[] args) { // 创建窗体对象 final Frame f = new Frame("更改背景色"); // 设置窗体属性和布局 f.setBounds(400, 200, 400, 300); f.setLayout(new FlowLayout()); // 创建四个按钮 Button redButton = new Button("红色"); Button greenButton = new Button("绿色"); Button buleButton = new Button("蓝色"); // 添加按钮 f.add(redButton); f.add(greenButton); f.add(buleButton); // 设置窗体关闭 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); // 对按钮添加动作事件 // redButton.addActionListener(new ActionListener() { // @Override // public void actionPerformed(ActionEvent e) { // f.setBackground(Color.RED); // } // }); // 对按钮添加鼠标点击事件 // redButton.addMouseListener(new MouseAdapter() { // @Override // public void mouseClicked(MouseEvent e) { // f.setBackground(Color.RED); // } // }); // 对按钮添加鼠标的进入事件 redButton.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { f.setBackground(Color.RED); } }); redButton.addMouseListener(new MouseAdapter() { @Override public void mouseExited(MouseEvent e) { f.setBackground(Color.WHITE); } }); greenButton.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { f.setBackground(Color.GREEN); } }); greenButton.addMouseListener(new MouseAdapter() { @Override public void mouseExited(MouseEvent e) { f.setBackground(Color.WHITE); } }); buleButton.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { f.setBackground(Color.BLUE); } }); buleButton.addMouseListener(new MouseAdapter() { @Override public void mouseExited(MouseEvent e) { f.setBackground(Color.WHITE); } }); // 设置窗体显示 f.setVisible(true); }}
- 键盘事件案例
import java.awt.FlowLayout;import java.awt.Frame;import java.awt.Label;import java.awt.TextField;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/* * 你输入的如果是非数字字符,就取消你键盘录入的效果。 */public class FrameDemo { public static void main(String[] args) { // 创建窗体对象并设置属性 Frame f = new Frame("不能输入非数字字符"); f.setBounds(400, 200, 400, 300); f.setLayout(new FlowLayout()); // 创建Label标签对象 Label label = new Label("请输入你的QQ号码,不能是非数字,不信你试试"); TextField tf = new TextField(40); // 添加到窗体上 f.add(label); f.add(tf); // 设置窗体关闭 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); // 给文本框添加事件 tf.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { // 如果你取得的字符不是数字字符就取消事件 // 思路:先获取字符,判断字符,取消事件 // char getKeyChar() char ch = e.getKeyChar();// System.out.println(ch); if(!(ch>='0' && ch<='9')){ e.consume(); } } }); // 设置窗体可见 f.setVisible(true); }}
菜单组件
菜单组件概述
- MenuBar : 菜单栏
- Menu : 菜单
- MenuItem : 菜单项
- 先创建菜单条,再创建菜单,每一个菜单中建立菜单项。
- 也可以菜单添加到菜单中,作为子菜单。
- 通过setMenuBar()方法,将菜单添加到Frame中。
import java.awt.FlowLayout;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 FrameDemo { public static void main(String[] args) { // 创建窗体对象并设置属性 final Frame f = new Frame("多级菜单"); f.setBounds(400, 200, 400, 300); f.setLayout(new FlowLayout()); final String name = f.getTitle(); // 创建菜单栏 MenuBar mb = new MenuBar(); // 创建菜单 Menu m1 = new Menu("文件"); Menu m2 = new Menu("更改名称"); // 创建菜单项 final MenuItem mi1 = new MenuItem("好好学习"); final MenuItem mi2 = new MenuItem("天天向上"); MenuItem mi3 = new MenuItem("恢复标题"); MenuItem mi4 = new MenuItem("打开记事本"); MenuItem mi5 = new MenuItem("退出系统"); // 谁添加谁呢 m2.add(mi1); m2.add(mi2); m2.add(mi3); m1.add(m2); m1.add(mi4); m1.add(mi5); mb.add(m1); // 设置菜单栏 f.setMenuBar(mb); // 设置窗体关闭 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); mi1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setTitle(mi1.getLabel()); } }); mi2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setTitle(mi2.getLabel()); } }); mi3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setTitle(name); } }); mi4.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Runtime r = Runtime.getRuntime(); try { r.exec("notepad"); } catch (IOException e1) { e1.printStackTrace(); } } }); mi5.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); // 设置窗体可见 f.setVisible(true); }}
Netbeans工具的概述和基本使用
模拟四则运算基本框架
第一步建立JFrame类
- 组合框设置
- 组合框设置
第二步JFrame类源代码修改
- 选中计算按钮做如下操作,并在Jbutton1ActionPerformed函数中做写如下代码。
- 选中计算按钮做如下操作,并在Jbutton1ActionPerformed函数中做写如下代码。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO 获取第一个操作数、操作符、第二个操作数 String firstNumberString = this.firstNumber.getText().trim(); String selectOperator = this.selectOperator.getSelectedItem().toString(); String secondNumberString = this.secondNumber.getText().trim(); //将字符串转化为整数 int firstNumber = Integer.parseInt(firstNumberString); int secondNumber = Integer.parseInt(secondNumberString); int resultNumber = 0; switch(selectOperator){ case "+": resultNumber = firstNumber + secondNumber; break; case "-": resultNumber = firstNumber - secondNumber; break; case "*": resultNumber = firstNumber * secondNumber; break; case "/": resultNumber = firstNumber / secondNumber; break; } this.result.setText(String.valueOf(resultNumber)); }
* 在NewJframe类中的init()方法添加如下代码:```java public NewJFrame() { initComponents(); init();}private void init() { this.setTitle("模拟四则运算"); //UiUtil.setFrameImage(this);}```
四则运算添加图标
- 第一步新建cn.itcast.resource包,将图片复制到此包下。
- 第二步新建cn.itcast.util界面管理包,新建UiUtil类添加如下代码。
import java.awt.Image;import java.awt.Toolkit;import javax.swing.JFrame;/** * 专门做界面效果的包 * @author Administrator */public class UiUtil { private UiUtil(){} //修改图标 public static void setFrameImage(JFrame jf){ //获取工具类对象 Toolkit tk = Toolkit.getDefaultToolkit(); //根据路径获取图片 Image i = tk.getImage("src\\cn\\itcast\\resource\\jjcc.jpg"); //给窗体设置图标 jf.setIconImage(i); }}
- 第三步在NewJframe类中的init()方法添加如下代码:
public NewJFrame() { initComponents(); init(); } private void init() { this.setTitle("模拟四则运算"); UiUtil.setFrameImage(this); }
四则运算设置窗体居中
- 第一步在cn.itcast.util界面管理包,UiUtil类添加如下代码。
//设置窗体居中 public static void setFrameCenter(JFrame jf) { /* 思路: A:获取屏幕的宽和高 B:获取窗体的宽和高 C:(用屏幕的宽-窗体的宽)/2,(用屏幕的高-窗体的高)/2作为窗体的新坐标。 */ //获取工具对象 Toolkit tk = Toolkit.getDefaultToolkit(); //获取屏幕的宽和高 Dimension d = tk.getScreenSize(); double srceenWidth = d.getWidth(); double srceenHeigth = d.getHeight(); //获取窗体的宽和高 int frameWidth = jf.getWidth(); int frameHeight = jf.getHeight(); //获取新的宽和高 int width = (int) (srceenWidth - frameWidth) / 2; int height = (int) (srceenHeigth - frameHeight) / 2; //设置窗体坐标 jf.setLocation(width, height); }
- 第三步在NewJframe类中的init()方法添加如下代码:
private void init() { this.setTitle("模拟四则运算"); UiUtil.setFrameImage(this); UiUtil.setFrameCenter(this); }
修改皮肤
第一步导入皮肤包:讲课件中准备好的皮肤包导入
第二步加入MyLookAndFeel文件
第三步在main方法中添加如下代码,并选择将语句包含在try-catch中
UIManager.setLookAndFeel(MyLookAndFeel.LIQUIDINF);
对四则运算加入校验
- 在main方法中加入如下代码:
//数据校验,必须是数字字符串 String regex = "\\d+"; //校验第一个数 if (!firstNumberString.matches(regex)) {// System.out.println("数据不匹配"); //public static void showMessageDialog(Component parentComponent,Object message) JOptionPane.showMessageDialog(this, "第一个操作数不满足要求必须是数字"); this.firstNumber.setText(""); this.firstNumber.requestFocus(); return;//回去吧 } if (!secondNumberString.matches(regex)) {// System.out.println("数据不匹配"); //public static void showMessageDialog(Component parentComponent,Object message) JOptionPane.showMessageDialog(this, "第二个操作数不满足要求必须是数字"); this.secondNumber.setText(""); this.secondNumber.requestFocus(); return;//回去吧 }
如何让Netbeans的东西Eclipse能访问。
- 在Eclipse中创建项目,把Netbeans项目的src下的东西给拿过来即可。
- 注意:修改项目编码为UTF-8
成员变量的重构
1 0
- No_16_0314 Java基础学习第十七天
- Java学习第十七天
- Java学习第十七天
- 黑马程序员--Java基础学习(集合工具类)第十七天
- Day17第十七天 java基础 -------JAVA类集
- 传智博客JAVA基础第十七天
- Java基础第十七天--IO流1
- java基础第十七天 io缓冲流
- java学习总结——第十七天
- .net学习第十七天
- 第十七天学习笔记
- Python学习---第十七天
- java第十七天
- 梦入IBM之java基础第十七天之线程
- Java进阶学习第十七天——JDBC入门学习
- Java基础第十七天学习日记_Collections和Arrays的常用方法、高级for循环、可变参数、静态导入
- java学习第十七天之ArrayList,LinkList,HashSet,TreeSet
- 设计模式学习第十七天
- 框架模式MVC 在Android中的使用
- 让swiperefreshlayout 加载更多。
- 利用iconv进行GB2312和Unicode的互转
- Linux常用部署命令集合
- 判断当前手机联网状态
- No_16_0314 Java基础学习第十七天
- 高级系统架构师培训笔记
- 在任意文件下创建文件
- 多线程通信的简单实践
- iOS8.0以上Label的警告处理
- Android图片海报制作-MaterialDesign使用
- Spring进阶之路(12)-注解方式实现Bean的注入
- 第三周上机实践项目 项目4--百钱百鸡问题
- 放麦子_蓝桥杯题目