## Java图形开发--GUI
### 1、图形用户界面(gui)介绍
图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。
awt,swing,swt,Jface是什么?
Sun已经提供了一个跨平台GUI开发工具包AWT抽象窗口工具箱(Abstract Window Toolkit).
↓
Sun又创建了一个新的GUI框架swing.解决了AWT存在的Icd问题.
↓
IBM认为swing比较消耗内存,创建了一个新的GUI库,这就是SWT
↓
IBM为了方便开发SWT程序,在SWT基础上又创建了一个更易用,功能强大的图开包"JFace"
### 2、eclipse开发工具介绍
eclipse是什么东西,我们用三句话来说明:
1、eclipse最早是IBM附属公司oti开发的,一共投入了4000万美金,后来捐献给开源社区
2、eclipse是一个开源的、可扩展的集成开发环境,已经成为目前最流行的java开发工具
3、eclipse安装后就可以开发java se的项目了,但不能开发java ee项目,需要安装web开发插件(lomboz或是myeclipse..)
ide(集成开发环境,比如jcreator、vs、myeclipse这些开发工具都是ide)
### 3、swing组件介绍
1、JFrame是Frame的子类
2、属于容器类组件,顶层容器
3、JFrame有一些常用的方法,通过示例与java的帮助文档即可了解。
![](https://box.kancloud.cn/2016-02-25_56ceb3e157efe.jpg)
在图形用户界面编程中,我们在窗体中会经常使用到按钮,我们在进行选择的时候,常常需要确认,所以按钮很重要。
只需要在窗体中添加按钮组件(JButton)即可完成。
### 按钮组件--深入讨论
1、JButton是AbstractButton的子类
2、属于窗口类组件,可以加入别的组件
3、Swing包的按钮组件不只有JButton,还有单选按钮(JRadioButton)、箭头按钮(BasicArrowButton)、触发器按钮(JToggleButton)。
~~~
/**
* 功能:GUI开发
*/
package com.gui;
import javax.swing.*;
import java.awt.*;
//JFrame是一个顶层容器类(可以添加其他swing组件的类)
public class Gui1 extends JFrame {
//需要的swing组件,定义到这里
JButton jb1 = null;
// 构造函数
public Gui1() {
// 创建了一个Button按钮
jb1 = new JButton("按钮");
// 添加组件
add(jb1);
// 给窗体设置标题
setTitle("hello,world!");
// 设置大小,按像素计算
setSize(200, 200);
// 设置初始位置
setLocation(100, 200);
// 设置当窗口关闭时,保证JVM也退出
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示
setVisible(true);
}
public static void main(String[] args) {
Gui1 gui1 = new Gui1();
}
}
~~~
### 4、三大常用布局管理器
### 布局管理器--介绍
#### 1、概念
组件在容器(比如JFrame)中的位置和大小是由布局管理器来决定的。所有的容器都会
使用一个布局管理器,通过它来自动进行组件的布局管理。
#### 2、种类
java共提供了五种布局管理器:流式布局管理器(FlowLayout)、边界布局管理器(BorderLayout)、网格布局管理器(GridLayout)、卡片布局管理器(CardLayout)、网格包布局管理器(GridBagLayout)。其中前三种是最常见的布局管理器。
##### 边界布局BorderLayout--介绍
边界布局(BorderLayout)将容器简单的划分为东南西北5个区域,中间区域最大。
JFrame窗体,JDialog对话框组件默认布局方法
~~~
/**
* 边界布局
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
//1.继承JFrame
public class Gui2 extends JFrame{
//2.定义组件
JButton jb1, jb2, jb3, jb4, jb5;
public Gui2(){
//3.创建组件
jb1 = new JButton("中部");
jb2 = new JButton("北部");
jb3 = new JButton("东部");
jb4 = new JButton("南部");
jb5 = new JButton("西部");
//4.添加各个组件
add(jb1, BorderLayout.CENTER);
add(jb2, BorderLayout.NORTH);
add(jb3, BorderLayout.EAST);
add(jb4, BorderLayout.SOUTH);
add(jb5, BorderLayout.WEST);
//5.设置窗体属性
setTitle("边界布局");
setSize(300, 200);
setLocation(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//6.显示窗体
setVisible(true);
}
public static void main(String[] args) {
Gui2 gui1 = new Gui2();
}
}
~~~
##### 边界布局BorderLayout--注意事项
1、不是五个部分都必需添加;
2、中部组件会自动调节大小;
3、JFrame,JDialog默认布局管理器就是BorderLayout
##### 流式布局FlowLayout--介绍
FlowLayout布局,按照组件的添加次序将按钮组件(当然也可以是别的组件)从左到右放置在容器中。当到达容器的边界时,组件将放置到下一行中。FlowLayout可以以左对齐、居中对齐、以右对齐的方式排列组件。
~~~
/**
* 流式布局
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui3 extends JFrame{
//定义组件
JButton jb1, jb2, jb3, jb4, jb5, jb6;
//构造函数
public Gui3(){
//创建组件
jb1 = new JButton("Button1");
jb2 = new JButton("Button2");
jb3 = new JButton("Button3");
jb4 = new JButton("Button4");
jb5 = new JButton("Button5");
jb6 = new JButton("Button6");
//添加组件
add(jb1);
add(jb2);
add(jb3);
add(jb4);
add(jb5);
add(jb6);
//设置流式布局
setLayout(new FlowLayout(FlowLayout.RIGHT));
//设置窗体属性
setTitle("流式布局");
setSize(300, 200);
setLocation(200, 200);
//禁止用户改变窗体大小
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui3 gui1 = new Gui3();
}
}
~~~
##### 流式布局FlowLayout--注意事项
1、不限制他所管理的组件大小,允许他们有最佳大小
2、当容器被缩放、扩大时,组件的位置可能变化,但组件的大小不变。
3、默认组件是居中对齐,可以通过FlowLayout(int align)函数来指定对齐方式。
##### 网格布局GridLayout--介绍
GridLayout布局,听其名而知其意,它将容器分割成多行多列,组件被填充到每个网格中,添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其它的组件,当占满该行的所有网格后,接着继续在下一行从左到右放置组件。
~~~
/**
* 网格布局
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui4 extends JFrame{
int size = 9;
//定义组件;
JButton[] jbs = new JButton[9];
public Gui4(){
//创建组件
for(int i = 0; i < size; i++){
jbs[i] = new JButton("" + i);
}
//设置网格布局
setLayout(new GridLayout(3, 3, 5, 5));
//添加组件
for(int i = 0; i < size; i++){
add(jbs[i]);
}
//设置窗体属性
setTitle("网格布局");
setSize(300, 300);
setLocation(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui4 gui1 = new Gui4();
}
}
~~~
##### 网格布局GridLayout--注意事项
1、组件的相对位置不随容器的缩放而变化,但大小会变化;
2、所有组件的大小相同;
3、可以通过GridLayout(int rows,int cols,int hgap,int vgap)来指定网格的行/列,水平间隙/垂直间隙。
参数说明:rows:行数/cols:列数/hgap:垂直间隙/vgap:水平间隙
#### 3、开发GUI程序步骤
1、继承JFrame(类继承)
2、定义需要的组件(成员变量)
3、创建组件(构造函数中)
4、添加组件(构造方法中)
5、设置布局管理器(构造方法中)
6、显示窗体(构造函数中)
### 5、Swing组件--面板组件
### 面板组件(JPanel)--介绍
在图形用户界面编程中,如果只是普通的组件布局,我们用前面讲的三种布局管理器就可以解决,但在比较复杂的布局要求时,就需要使用布局管理器的组合使用。
JPanel:面板组件,非顶层容器,一个界面只可以有一个JFrame窗体组件,但可以有多个JPanel面板组件,而JPanel上也可以使用FlowLayout、BorderLayout、GirdLayout等各种布局管理器,这样可以组合使用达到较为复杂的布局效果。
~~~
/**
* 多种布局管理器的使用
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui5 extends JFrame{
//定义组件
JPanel jp1, jp2;
JButton jb1, jb2, jb3, jb4, jb5, jb6;
//构造方法
public Gui5(){
//创建组件
//JPanel布局默认是FlowLayout
jp1 = new JPanel();
jp2 = new JPanel();
jb1 = new JButton("Button1");
jb2 = new JButton("Button2");
jb3 = new JButton("Button3");
jb4 = new JButton("Button4");
jb5 = new JButton("Button5");
jb6 = new JButton("Button6");
//添加JPanel
jp1.add(jb1);
jp1.add(jb2);
jp2.add(jb3);
jp2.add(jb4);
jp2.add(jb5);
//把JPanel加入JFrame
add(jp1, BorderLayout.NORTH);
add(jb6, BorderLayout.CENTER);
add(jp2, BorderLayout.SOUTH);
//设置窗体
setTitle("多种布局管理器的使用");
setSize(300, 300);
setLocation(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]){
Gui5 gui1 = new Gui5();
}
}
~~~
### 面板(JPanel)组件--注意事项
1、JPanel是JComponent的子类;
2、属于容器类组件,可以加入别的组件;
3、默认布局管理器是流式布局(FlowLayout)
### Swing组件--文本框/密码框/标签组件
在图形用户界面编程中,我们常常会提供用户登录界面,比如登录到会员管理系统,登录到工资管理系统、仓库管理系统等。这时候我们就会用到:
1、文本框(JTextField)
2、密码框(JPasswordField)
3、标签(JLable)
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui6 extends JFrame{
//定义组件
JPanel jp1, jp2, jp3;
JLabel jlb1, jlb2;
JButton jb1, jb2;
JTextField jtf;
JPasswordField jpf;
//构造方法
public Gui6(){
//创建组件
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jlb1 = new JLabel("用户名:");
jlb2 = new JLabel("密 码:");
jb1 = new JButton("登录");
jb2 = new JButton("取消");
jtf = new JTextField(10);
jpf = new JPasswordField(10);
//设置布局管理器
setLayout(new GridLayout(3, 1));
//加入组件
jp1.add(jlb1);
jp1.add(jtf);
jp2.add(jlb2);
jp2.add(jpf);
jp3.add(jb1);
jp3.add(jb2);
//加入到JFrame
add(jp1);
add(jp2);
add(jp3);
//设置窗体
setTitle("登录界面");
setSize(300, 150);
setLocation(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui6 gui1 = new Gui6();
}
}
~~~
### Swing组件--复选框/单选框组件
在图形用户界面编程中,我们常常会提供用户注册界面,这时候我们就会用到:
1、复选框组件(JCheckBox)
2、单选框组件(JRadioBuutton)
特别说明:
同一组单选按钮必需先创建ButtonGroup,然后把单选框组件放入到ButtonGroup中
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui7 extends JFrame{
//定义组件
JPanel jp1, jp2, jp3;
JLabel jl1, jl2;
JButton jb1, jb2;
JCheckBox jcb1, jcb2, jcb3;
JRadioButton jrb1, jrb2;
ButtonGroup bg;
//构造函数
public Gui7(){
//创建组件
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jl1 = new JLabel("你喜欢的运动:");
jl2 = new JLabel("你喜欢的运动:");
jb1 = new JButton("注册用户");
jb2 = new JButton("取消注册");
jcb1 = new JCheckBox("足球");
jcb2 = new JCheckBox("篮球");
jcb3 = new JCheckBox("网球");
jrb1 = new JRadioButton("男");
jrb2 = new JRadioButton("女");
//单选组件一定要放入到一个ButtonGroup
//不放入的话,可以多选
bg = new ButtonGroup();
bg.add(jrb1);
bg.add(jrb2);
//设置布局管理器
setLayout(new GridLayout(3, 1));
//添加组件
jp1.add(jl1);
jp1.add(jcb1);
jp1.add(jcb2);
jp1.add(jcb3);
jp2.add(jl2);
jp2.add(jrb1);
jp2.add(jrb2);
jp3.add(jb1);
jp3.add(jb2);
add(jp1);
add(jp2);
add(jp3);
//设置窗体
setTitle("调查报告");
setSize(300, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui7 gui1 = new Gui7();
}
}
~~~
### Swing组件--下拉框/列表框/流动空格组件
在图形用户界面编程中,常常会提供用户调查界面,这个时候会用到:
1、下拉框组件(JComboBox)
2、列表框组件(JList)
3、滚动窗格组件(JScrollPane)
特别说明:
一般来说,列表框组件+滚动窗格组件是结合使用的。目的是让列表框中的选项可以有滚动条支持。
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui8 extends JFrame{
//定义组件
JPanel jp1, jp2;
JLabel jl1, jl2;
JComboBox jcb;
JList jlist;
JScrollPane jsp;
//构造方法
public Gui8(){
//创建组件
jp1 = new JPanel();
jp2 = new JPanel();
jl1 = new JLabel("你的籍贯:");
jl2 = new JLabel("旅游地点:");
String[] jg = {"北京", "上海", "天津", "火星"};
jcb = new JComboBox(jg);
String[] dd = {"九寨沟", "故宫", "长城", "天安门"};
jlist = new JList(dd);
//设置显示选项个数
jlist.setVisibleRowCount(2);
jsp = new JScrollPane(jlist);
//设置布局
setLayout(new GridLayout(3, 1));
//添加组件
jp1.add(jl1);
jp1.add(jcb);
jp2.add(jl2);
jp2.add(jsp);
add(jp1);
add(jp2);
//设置窗体
setTitle("旅游");
setSize(300, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui8 gui1 = new Gui8();
}
}
~~~
### Swing组件--总结
总结:
1、Swing的常用组件(JFrame(框架)、Jpanel(面板)、JButton(按钮)、JLable(标签)、JTextField(文本框)、JPasswordField(密码框)、JCheckBox(复选框)、JRadioButton(单选框)、JComboBox(下拉框)、JScrollPane(滚动窗格)、JList(列表框))。
2、三大布局管理器(BorderLayout(边界布局)、FlowLayout(流布局)、GridLayout(网格布局)),要灵活使用,从而满足设计需求。
### 6、GUI编程实践
### 1、拆分窗格(JSplitPane)属于容器类组件
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui9 extends JFrame{
//定义组件
JSplitPane jsp;
JList jlist;
JLabel jl;
//构造方法
public Gui9(){
//创建组件
String[] words = {"boy", "girl", "bird"};
jlist = new JList(words);
jl = new JLabel(new ImageIcon("images/image01.jpg"));
//拆分窗格
jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jlist, jl);
//可以变化
jsp.setOneTouchExpandable(true);
//添加组件
add(jsp);
//设置窗体
setTitle("分割");
setSize(400, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui9 gui1 = new Gui9();
}
}
~~~
### 2、多行文本框(JTextArea)组件
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui10 extends JFrame{
//定义组件
JTextArea jta = null;
JPanel jp1 = null;
JComboBox jcb = null;
JTextField jtf = null;
JButton jb = null;
JScrollPane jsp = null;
//构造方法
public Gui10(){
jta = new JTextArea();
jsp = new JScrollPane(jta);
jp1 = new JPanel();
String[] chatter = {"张三","李四"};
jcb = new JComboBox(chatter);
jtf = new JTextField(10);
jb = new JButton("发送");
//添加组件
jp1.add(jcb);
jp1.add(jtf);
jp1.add(jb);
//加入JFrame
add(jsp);
add(jp1, BorderLayout.SOUTH);
//设置窗体
setIconImage((new ImageIcon("images/image01.jpg")).getImage());
setTitle("聊天");
setSize(400, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui10 gui1 = new Gui10();
}
}
~~~
### 3、页签组件(JTabbedPane)选项卡窗格
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui11 extends JFrame{
//定义组件
JPanel jp1, jp2, jp3, jp4;
JLabel jl1, jl2, jl3, jl4, jl5;
JTextField jtf1;
JPasswordField jpf1;
JCheckBox jcb1, jcb2;
JButton jb1, jb2, jb3, jb4;
JTabbedPane jtp;
//构造函数
public Gui11(){
//创建组件
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
jl1 = new JLabel(new ImageIcon("images/image01.jpg"));
jl2 = new JLabel("账号");
jl3 = new JLabel("密码");
jl4 = new JLabel("忘记密码");
jl4.setForeground(Color.BLUE);
jl5 = new JLabel("<html><a href='http://blog.csdn.net/q547550831'>访问</a>");
jl5.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
jtf1 = new JTextField(10);
jpf1 = new JPasswordField(10);
jcb1 = new JCheckBox("隐身登录");
jcb2 = new JCheckBox("记住密码");
jb1 = new JButton("清除号码");
jb2 = new JButton("登录");
jb3 = new JButton("注销");
jb4 = new JButton("注册");
jtp = new JTabbedPane();
//设置布局
jp1.setLayout(new GridLayout(3, 3));
jp1.add(jl2);
jp1.add(jtf1);
jp1.add(jb1);
jp1.add(jl3);
jp1.add(jpf1);
jp1.add(jl4);
jp1.add(jcb1);
jp1.add(jcb2);
jp1.add(jl5);
jp2.setBackground(Color.RED);
jp3.setBackground(Color.BLUE);
jtp.add("账号", jp1);
jtp.add("手机号码", jp2);
jtp.add("电子邮件", jp3);
jp4.add(jb2);
jp4.add(jb3);
jp4.add(jb4);
//加入到JFrame
add(jl1, BorderLayout.NORTH);
add(jtp);
add(jp4, BorderLayout.SOUTH);
//设置窗体
setTitle("登录界面");
setIconImage((new ImageIcon("images/image02.jpg")).getImage());
setSize(400, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui11 gui1 = new Gui11();
}
}
~~~
### 4、菜单组件(JMenuBar、JMenu、JMenuItem)工具条组件(JToolBar)
~~~
package com.gui;
/**
* 1、菜单组件
JMenuBar 菜单条组件 树干
JMenu 菜单组件 树枝
JMenuItem 菜单项组件 树叶
2、二级菜单制作
JMenu里面可以嵌套JMenu
3、工具条组件
JToolBar 容器类组件
*/
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.InputMethodEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Gui12 extends JFrame{
//文件组定义组件
JMenuBar jmb;//菜单条组件
JMenu menu1,menu2,menu3,menu4,menu5;//主菜单:文件、编辑、格式、查看、帮助
JMenuItem item2,item3,item4,item5,item6,item7;//子菜单:新建、打开、保存、另存为、页面设置、打印、退出
JMenu xinjian;//二级菜单
JMenuItem file,project;
//编辑组定义组件
//编辑:撤消、剪切、复制、粘贴、删除、查找、查找下一个、替换、转到、全选、时间/日期
JMenuItem eitem1,eitem2,eitem3,eitem4,eitem5,eitem6,eitem7,eitem8,eitem9,eitem10,eitem11;
//格式组定义组件
JMenuItem oitem1,oitem2;//格式:自动换行、字体
//查看组定义组件
JMenuItem vitem1;//查看:状态栏
//帮助组定义组件
JMenuItem hitem1,hitem2;//帮助:查看帮助、关于记事本
JTextArea jta;
//工具条
JToolBar jtb;
JButton jb1,jb2,jb3,jb4,jb5,jb6,jb7,jb8;
public static void main(String[] args) {
Gui12 win=new Gui12();
}
//构造函数
public Gui12(){
//构建组件
//工具条
jtb=new JToolBar();
jb1=new JButton(new ImageIcon("images/new.jpg"));
jb1.setToolTipText("新建");//设置提示信息
jb2=new JButton(new ImageIcon("images/open.jpg"));
jb2.setToolTipText("打开");
jb3=new JButton(new ImageIcon("images/save.jpg"));
jb3.setToolTipText("保存");
jb4=new JButton(new ImageIcon("images/copy.jpg"));
jb4.setToolTipText("复制");
jb5=new JButton(new ImageIcon("images/delete.jpg"));
jb5.setToolTipText("删除");
jb6=new JButton(new ImageIcon("images/modify.jpg"));
jb6.setToolTipText("编辑");
jb7=new JButton(new ImageIcon("images/print.jpg"));
jb7.setToolTipText("打印");
jb8=new JButton(new ImageIcon("images/close.jpg"));
jb8.setToolTipText("关闭");
jmb=new JMenuBar();
//主菜单
menu1=new JMenu("文件(F)");
menu1.setMnemonic('F');//设置助记符
menu2=new JMenu("编辑(E)");
menu2.setMnemonic('E');
menu3=new JMenu("格式(O)");
menu3.setMnemonic('O');
menu4=new JMenu("查看(V)");
menu4.setMnemonic('V');
menu5=new JMenu("帮助(H)");
menu5.setMnemonic('H');
//文件--新建--子目录
xinjian=new JMenu("新建");
file=new JMenuItem("文件");
project=new JMenuItem("工程");
item2=new JMenuItem("打开(O)");
item2.setMnemonic('O');
item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));//设置ctrl快捷组合键
item3=new JMenuItem("保存(S)");
item3.setMnemonic('S');
item3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
item4=new JMenuItem("另存为(A)");
item4.setMnemonic('A');
item5=new JMenuItem("页面设置(U)");
item5.setMnemonic('U');
item6=new JMenuItem("打印(P)");
item6.setMnemonic('P');
item6.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
item7=new JMenuItem("退出(X)");
item7.setMnemonic('X');
eitem1=new JMenuItem("撤消(U)");
eitem1.setMnemonic('U');
eitem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));
eitem2=new JMenuItem("剪切(T)");
eitem2.setMnemonic('T');
eitem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK));
eitem3=new JMenuItem("复制(C)");
eitem3.setMnemonic('C');
eitem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
eitem4=new JMenuItem("粘贴(P)");
eitem4.setMnemonic('P');
eitem4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
eitem5=new JMenuItem("删除(L)");
eitem5.setMnemonic('L');
eitem5.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
eitem6=new JMenuItem("查找(F)");
eitem6.setMnemonic('F');
eitem6.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_MASK));
eitem7=new JMenuItem("查找下一个(N)");
eitem7.setMnemonic('N');
eitem7.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
eitem8=new JMenuItem("替换(R)");
eitem8.setMnemonic('R');
eitem8.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_MASK));
eitem9=new JMenuItem("转到(G)");
eitem9.setMnemonic('G');
eitem9.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G,InputEvent.CTRL_MASK));
eitem10=new JMenuItem("全选(A)");
eitem10.setMnemonic('A');
eitem10.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
eitem11=new JMenuItem("时间/日期(D)");
eitem11.setMnemonic('D');
eitem11.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
oitem1=new JMenuItem("自动换行(W)");
oitem1.setMnemonic('W');
oitem2=new JMenuItem("字体(F)");
oitem2.setMnemonic('F');
vitem1=new JMenuItem("状态栏(S)");
vitem1.setMnemonic('S');
hitem1=new JMenuItem("查看帮助(H)");
hitem1.setMnemonic('H');
hitem2=new JMenuItem("关于记事本(A)");
hitem2.setMnemonic('A');
jta=new JTextArea();
//设定布局管理器
//加入组件
//将按钮添加到工具条上
jtb.add(jb1);
jtb.add(jb2);
jtb.add(jb3);
jtb.add(jb4);
jtb.add(jb5);
jtb.add(jb6);
jtb.add(jb7);
jtb.add(jb8);
//将菜单项添加到菜单上
xinjian.add(file);
xinjian.add(project);
menu1.add(xinjian);
menu1.add(item2);
menu1.add(item3);
menu1.add(item4);
menu1.addSeparator();//添加分割线
menu1.add(item5);
menu1.add(item6);
menu1.addSeparator();
menu1.add(item7);
menu2.add(eitem1);
menu2.addSeparator();
menu2.add(eitem2);
menu2.add(eitem3);
menu2.add(eitem4);
menu2.add(eitem5);
menu2.addSeparator();
menu2.add(eitem6);
menu2.add(eitem7);
menu2.add(eitem8);
menu2.add(eitem9);
menu2.addSeparator();
menu2.add(eitem10);
menu2.add(eitem11);
menu3.add(oitem1);
menu3.add(oitem2);
menu4.add(vitem1);
menu5.add(hitem1);
menu5.addSeparator();
menu5.add(hitem2);
//将菜单添加到菜单条上
jmb.add(menu1);
jmb.add(menu2);
jmb.add(menu3);
jmb.add(menu4);
jmb.add(menu5);
//将菜单条添加到窗体上
this.setJMenuBar(jmb);
//将工具条添加到窗体上
this.add(jtb,BorderLayout.NORTH);
JScrollPane jsp=new JScrollPane(jta);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jsp);
//窗体设置
this.setTitle("Java记事本");
this.setSize(500, 400);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
~~~
### 7、java绘图坐标体系
### 绘图坐标本系--介绍
坐标原点位于左上角,以像素为单位。像素是计算机屏幕上最小的显示单位。在java的坐标系中,第一个是X坐标,表示当前位置为水平方向,距离坐标原点X个像素;第二个是Y坐标,表示当前位置为垂直方向,距离坐标原点Y个像素。
![](https://box.kancloud.cn/2016-02-25_56ceb3e17d02e.jpg)
### 坐标体系--像素
计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显示更多的像素。因此,像素是一个密度单位,而厘米是长度单位,两者无法比较。
### 绘图原理(1)
Component类提供了两个和绘图相关最重要的方法:
1、paint(Graphics g)绘制组件的外观
2、repaint()刷新组件的外观
当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件
### 绘图原理(2)
在以下情况paint()将会被调用:
1、窗口最小化,再最大化
2、窗口的大小发生变化
3、repaint函数被调用
### java绘图技术--Graphics
#### Graphics类
Graphics类你可以理解就是画笔,为我们提供了各种绘制图形的方法:
1、画直线 drawLine(int x1,int y1,int x2,int y2);
2、画矩形边框 drawRect(int x,int y,int width,int height);
3、画椭圆边框 drawOval(int x,int y,int width,int height);
4、填充矩形 fillRect(int x,int y,int width,int height);
5、填充椭圆 fillOval(int x,int y,int width,int height);
6、画图片 drawImage(Image img.int x,int y,..);
7、画字符串 drawString(String str,int x,int y);
8、设置画笔的字体 setFont(Font font);
9、设置画笔的颜色 setColor(Color c);
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui13 extends JFrame{
MyPanel mp = null;
public Gui13(){
mp = new MyPanel();
add(mp);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui13 gui1 = new Gui13();
}
}
//定义一个MyPanel,用于绘图和显示绘图的区域
class MyPanel extends JPanel{
//覆盖JPanel的paint方法
//Graphics是绘图的重要类,等价于画笔
public void paint(Graphics g){
//1.调用父类方法,完成初始化
super.paint(g);
//空心圆
//g.drawOval(10, 10, 30, 30);
//直线
//g.drawLine(10, 10, 40, 40);
//空心矩形
//g.drawRect(10, 10, 40, 60);
//填充矩形
// g.setColor(Color.BLUE);
// g.fillRect(10, 10, 40, 60);
// g.setColor(Color.RED);
// g.fillRect(70, 70, 40, 60);
//在面板上画出图片
// Image im = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/images/image01.jpg"));
// g.drawImage(im, 10, 10, 200, 150, this);
//字符
// g.setColor(Color.red);
// g.setFont(new Font(("隶书"), Font.BOLD, 30));
// g.drawString("String 字符串", 100, 100);
//圆的轮廓
g.drawArc(100, 100, 100, 100, 20, 300);
}
}
~~~
### 8、java事件处理机制
### java事件处理机制--初步介绍
java事件处理是采取“委派事件模型”。所谓“委派事件模型”是指当事件发生时,产生事件的对象(即事件源),会把此“信息”传递给“事件的监听者”处理的一种方式,而这里所说的“信息”实际上就是java.awt.event事件类库里某个类所创建的对象,我们暂时把它称为“事件的对象”。
![](https://box.kancloud.cn/2016-02-25_56ceb3e18eb88.jpg)
比如:当按下按钮时,就会在按钮触发一个“事件”,程序就会产生一个“事件对象”来表示这个事件,并把这个“事件对象”传递给“事件的监听者”,“事件的监听者”再根据“事件对象”的类型进行相应处理。
为了让“产生事件的对象”[比如按钮]知道要把事件传递给哪一个“事件监听者”,我们必需先把“事件监听者”在“产生事件的对象”注册,这个操作也就是要告知“产生事件的对象”要把事件传递给它。
![](https://box.kancloud.cn/2016-02-25_56ceb3e19f8db.jpg)
~~~
/**
* 功能:事件处理机制
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui14 extends JFrame implements ActionListener{
//定义组件
Panel mp = null;
JButton jb1, jb2;
public Gui14(){
mp = new Panel();
//设置背景颜色
mp.setBackground(Color.black);
jb1 = new JButton("黑色");
jb2 = new JButton("红色");
add(jb1, BorderLayout.NORTH);
add(mp);
add(jb2, BorderLayout.SOUTH);
//注册监听
jb1.addActionListener(this);
jb2.addActionListener(this);
//事件源是jb1,jb2,事件监听者是gui14的对象
//指定action命令
jb1.setActionCommand("黑色");
jb2.setActionCommand("红色");
//设置窗体
setSize(300, 200);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui14 gui1 = new Gui14();
}
//对事件处理的方法
@Override
public void actionPerformed(ActionEvent e) {
//判断是哪个按钮被点击
if(e.getActionCommand().equals("黑色")){
//System.out.println("黑色");
mp.setBackground(Color.black);
} else if(e.getActionCommand().equals("红色")){
//System.out.println("红色");
mp.setBackground(Color.red);
} else {
}
}
}
class MyPanel2 extends JPanel{
public void paint(Graphics g){
}
}
~~~
~~~
/**
* 1.通过上下左右键来控制一个小球的移动
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui15 extends JFrame{
//定义组件
MyPanel3 mp =null;
public Gui15(){
mp = new MyPanel3();
//mp加入JFrame
add(mp);
//添加监听
addKeyListener(mp);
//设置窗体
setTitle("小球");
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui15 gui1 = new Gui15();
}
}
//定义自己的面板
class MyPanel3 extends JPanel implements KeyListener{
private int x = 10;
private int y = 10;
public void paint(Graphics g){
super.paint(g);
//圆
g.fillOval(x, y, 20, 20);
}
//输入的一个具体信息
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("typed");
}
//按压
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("press");
//向下 向上 向左 向右
if(e.getKeyCode() == KeyEvent.VK_DOWN){
y += 2;
} else if(e.getKeyCode() == KeyEvent.VK_UP){
y -= 2;
} else if(e.getKeyCode() == KeyEvent.VK_LEFT){
x -= 2;
} else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
x += 2;
}
//调用repaint()方法,重绘面板
repaint();
}
//释放
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("released" + (char)e.getKeyCode());
}
}
~~~
### java事件处理机制--深入理解
#### 1、事件源
事件源是一个产生(或触发)事件的对象,比如前面的JButton的一个对象jb1。当这个事件源对象的某些状态以某种方式发生变化时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)。如果某个组件(对象)希望得到事件源产生的事件,就需要在这个事件源上注册。
#### 2、事件
事件就是承载事件源状态改变时的信息对象。或者说,事件是事件源事件监听器传输事件源状态信息的载体。在用户与GUI组件进行交互时就会生成事件,比如当鼠标在面板中移动时,就会生成一个鼠标移动事件的对象,而这个对象保存着当前鼠标在面板中位置信息。java.awt.event包和javax.swing.event包中定义了各种事件类型,常见的事件类有:
<table><tbody><tr><td valign="top"><p>事件类</p></td><td valign="top"><p>说明</p></td></tr><tr><td valign="top"><p>ActionEvent</p></td><td valign="top"><p>通常在按下按钮,或双击一个列表项或选中某个菜单时发生</p></td></tr><tr><td valign="top"><p>AdjustmentEvnet</p></td><td valign="top"><p>当操作一个滚动条时发生</p></td></tr><tr><td valign="top"><p>ComponentEvent</p></td><td valign="top"><p>当一个组件隐藏、移动、改变大小时发送</p></td></tr><tr><td valign="top"><p>ContainerEvent</p></td><td valign="top"><p>当一个组件从容器中加入或者删除时发生</p></td></tr><tr><td valign="top"><p>FocusEvent</p></td><td valign="top"><p>当一个组件获得或是失去焦点时发生</p></td></tr><tr><td valign="top"><p>ItemEvent</p></td><td valign="top"><p>当一个复选框或是列表项被选中时,当一个选择框或选择菜单被选中</p></td></tr><tr><td valign="top"><p>KeyEvent</p></td><td valign="top"><p>当从键盘的按键被按下,松开时发生</p></td></tr><tr><td valign="top"><p>MouseEvent</p></td><td valign="top"><p>当鼠标被拖动、移动、点击、按下..</p></td></tr><tr><td valign="top"><p>TextEvent</p></td><td valign="top"><p>当文本区和文本域的文本发生改变时发生</p></td></tr><tr><td valign="top"><p>WindowEvent</p></td><td valign="top"><p>当一个窗口激活、关闭、失效、恢复、最小化...</p></td></tr></tbody></table>
#### 3、事件监听器接口
事件源产生一个事件,可以传送给事件监听者处理,那么怎样才能编写一个事件监听者呢?
事件监听者实际上就是一个类,该类实现了某个事件监听器接口、比如前面我们案例中的MyPanel就是一个类,它实现了ActionListener接口,它就可以作为一个事件监听者,对接受到的事件进行处理。
事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现一个事件监听接口,也可以实现多个监听接口,这些接口在java.awt.event和javax.swing.event包中定义。
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui16 extends JFrame{
//定义组件
MyPanel4 mp = null;
//构造方法
public Gui16(){
mp = new MyPanel4();
//mp加入JFrame
add(mp);
//注册监听
addMouseListener(mp);
addKeyListener(mp);
addMouseMotionListener(mp);
//设置窗体
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui16 gui1 = new Gui16();
}
}
//1 鼠标按下输出坐标,移出,移入,按下,释放
//2.按键按下对应字符
//3.鼠标移动、拖拽
//4.窗口变化(关闭,最小化,最大化)
//定义自己的面板
class MyPanel4 extends JPanel implements MouseListener, KeyListener, MouseMotionListener, WindowListener{
public void paint(Graphics g){
super.paint(g);
}
//鼠标
//鼠标点击
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标点击了 x = " + e.getX() + " y = " + e.getY());
}
//鼠标按下
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标按下");
}
//鼠标松开
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标松开");
}
//鼠标移动到MyPanel4
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标移出");
}
//鼠标移出MyPanel4
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标进入");
}
//鼠标拖拽
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
//鼠标移动
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标当前坐标x = " + e.getX() + " Y = " + e.getY());
}
//键盘
//输入具体信息
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//按下
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
System.out.println(e.getKeyChar() + "键被按下");
}
//释放
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
//窗口
//窗口打开
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口正在关闭
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口关闭
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口最小化
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口最小化到显示
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口被激活了
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口变成非激活窗口
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
~~~
### java事件处理机制--总结
#### 总结--事件编程步骤:
1、编写事件处理类(事件监听者)
2、根据需求给事件处理类实现监听器接口
3、在事件处理中重写(实现)其事件处理的函数
4、在事件源类中指定该事件的监听器(响应者)是谁
#### 注意事项:
1、java采用委托机制处理事件
2、java中的事件是分类的,比如对窗体事件、鼠标事件、按键事件、操作事件[按按钮]
3、java中一个类要监听某个事件,则必需实现相应的事件监听接口
4、事件监听接口有多种,程序员应当针对不同的情况,实现不同的监听接口,比如监听鼠标事件就应当实现MouseListener;要监听键盘事件,就应当实现KeyListener..
5、在实现监听接口的类(事件监听类/者)中,需要重写处理函数,比如实现了ActionListener接口,就应当重写actionPerformed(ActionEvent e),可以参考前面的事件监听器接口表格
6、在事件源中需要注册事件监听类。否则事件监听类接收不到事件源发生的事件。
#### 一个类要实现监听的步骤:
a、实现相应的接口[KeyListener/MouseListener/ActionListener/WindowListener]
b、把接口的处理方法根据需要重新编写(Override)
c、在事件源上注册监听
d、事件传递是靠事件(类)对象
----------参考《韩顺平.循序渐进学.java.从入门到精通》
----------参考《JDK_API_1_6_zh_CN》
Java学习笔记--导航[http://blog.csdn.net/q547550831/article/details/49819641](http://blog.csdn.net/q547550831/article/details/49819641)