day23 GUI.docx
《day23 GUI.docx》由会员分享,可在线阅读,更多相关《day23 GUI.docx(42页珍藏版)》请在冰豆网上搜索。
![day23 GUI.docx](https://file1.bdocx.com/fileroot1/2022-12/29/d88fd039-75e7-424d-bbb6-fa229a98b1e0/d88fd039-75e7-424d-bbb6-fa229a98b1e01.gif)
day23GUI
1.GUI编程引言
以前的学习当中,我们都使用的是命令交互方式:
例如:
在DOS命令行中通过javacjava命令启动程序.
软件的交互的方式:
1.命令交互方式
图书管理系统
2.图形交互方式
Java提供了专业的API用于开发图形用户界面
GUI-->GraphicUserInterface
将要了解GUIAPI的框架结构,以及GUI组件以及组件之间的关系,容器和布局管理器,颜色,字体等.
2.GUI的分类
2.1.AWT
Java1.0版本的图形用户界面库,设计目标是帮助程序员编写在所有平台上都能良好表现的GUI程序。
为了实现这个目标Java1.0提供了抽象窗口工具集(AWT),但是这个目标并没有达到。
AWT在所有的系统上表现都不好。
因为:
最初版本的AWT是在一个月内构思,设计和实现的(ThinkinJava)。
AbstractWindowToolkit抽象窗口工具集
Java将图形用户界面相关的类捆绑在了一起,放在了一个称之为抽象窗口工具集的库中.AWT适合开发简单的图形用户界面,并不适合开发复杂的GUI项目.
位于:
java.awt.*中,定义了很多的组件类,开发者可以直接创建对象加以使用
缺点:
所有的图形界面都依赖于底层的操作系统,容易发生于特定平台相关的故障.
AWT调用本地系统资源生成图形化界面,依赖本地平台.1.0
2.2.Swing
SUN公司对AWT进行了升级,基于AWT,推出了一种更稳定,更通用和更灵活的库.称之为Swing组件库(Swingcomponent)。
既然都是用于GUI设计的组件库,那么为了区分Swing组件类和对应的AWT组件类,Swing组件类都已字母J为前缀.位于:
javax.swing.*中,提供了和AWT中等同的所有的组件类,但是类名的前面多加了一个J.
SWING可以跨平台.1.2
我们主要学习SwingGUI组件.
3.JavaGUIAPI
GUIAPI包含的类分为三个部分:
组件类(componentclass)容器类(containerclass),和辅助类(helperclass)
1.组件类是用来创建用户图形界面的,例如JButton,JLabel,JTextField.
2.容器类是用来包含其他组件的,例如JFrame,JPanel
3.辅助类是用来支持GUI组件的,例如Color,Font
3.1.组件类
在图形用户界面程序中当我们想要创建按钮、复选框和滚动条等这些可以显示在屏幕上的对象,该如何创建。
其实这些都属于一类叫做组件类。
AWT中的组件根类
类Component
java.lang.Object
java.awt.Component
Swing中的组件根类
javax.swing
类JComponent
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
组件类的实例可以显示在屏幕上.Component类是包括容器类的所有用户界面类的根类是java.awt中的类,对应的Swing中的是Jcomponent.了解了Component和JComponent都是抽象类.所以不能使用new关键字创建对象.所以需要使用它们的具体的实现类来创建对象.
在AWT中典型图形用户界面中的按钮(Button)、复选框(Checkbox)和滚动条(Scrollbar)都是组件类,都是Component类的子类.
在Swing中的GUI组件,有对应的JButton,JCheckBox,JscrollBar
继承关系图(AWT)
3.2.容器类
容器(Container),是一个特殊的组件,该组件可以通过add()添加其他组件。
容器类适用于盛装其他GUI组件的GUI组件.例如PanelFrameDialog都是AWT组件的容器类.对应的Swing组件的容器类是JPanelJFrameJDialog
3.3.GUI辅助类
用来描述GUI组件的属性,例如图像的颜色,字体等.注意:
辅助类是在java.awt中的
3.4.GUI运行原理
在JDK的bin目录中有javaw.exe.javaw.exe是java在window中专门用于执行GUI程序.
4.体验GUI
importjavax.swing.JFrame;
importjavax.swing.JOptionPane;
publicclassDemo{
publicstaticvoidmain(String[]args){
//创建JFrame
JFrameframe=newJFrame("hello,world");
//设置尺寸
frame.setSize(200,100);
//JFrame在屏幕居中
frame.setLocationRelativeTo(null);
//JFrame关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示JFrame
frame.setVisible(true);
}
}
5.Jframe框架
JFrame(框架)是一个容器
创建一个用户界面需要创建一个JFrame来存放用户界面组件.例如存放按钮,文本框。
javax.swing
类JFrame
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame
5.1.创建一个框架
publicclassDemo1{
publicstaticvoidmain(String[]args){
//创建JFrame
JFrameframe=newJFrame("我的frame");
//显示JFrame
frame.setVisible(true);
}
}
注意:
需要调用setVisible(true)方法后才会显示框架
运行程序会在窗口的左上角显示一个窗口,但是只能显示标题栏,而且关闭JFrame时,程序程序没有停止.
所以需要完成如下需求:
1:
设置Jframe的宽度和高度
2:
让Jframe显示在屏幕中间
3:
关闭Jframe时,程序会停止
5.1.1.设置JFrame的宽度和高度
java.awt.Window.setSize(intwidth,intheight)
查找API文档,查看setSize方法,可以指定框架的宽度和高度.参数类型是int,注意是以像素为单位,普通的笔记本的屏幕分辨率为1280*800或者1366*768.注意:
分辨率表示每平方英寸的像素数.屏幕分辨率越高,屏幕的像素越多.所以分辨率越高看到的细节就越多.
setSize方法被定义在java.awt.Component类中,被Component的子类java.awt.Window重写.而Jframe以继承了Windiws类所以也具备该方法.
5.1.2.JFrame显示在屏幕中间
setLocationRelativeTo()方法
java.awt.Window.setLocationRelativeTo(Componentc)
设置窗口相对于指定组件的位置。
如果c为null,则此窗口将置于屏幕的中央。
setLocationRelativeTo(null)方法可以在屏幕上居中显示框架.
如果不想要设置在中间,可以使用
setLocation(200,100);
5.1.3.关闭JFrame程序停止
setDefaultCloseOperation(intoperation)方法
javax.swing.JFrame.setDefaultCloseOperation(intoperation)
该方法告诉程序,当框架关闭时结束程序.方法的参数是JFrame的常量EXIT_ON_CLOSE
添加完毕
publicclassDemo1{
publicstaticvoidmain(String[]args){
//创建JFrame
JFrameframe=newJFrame("我的frame");
//设置尺寸
frame.setSize(200,100);
//JFrame在屏幕居中
frame.setLocationRelativeTo(null);
//JFrame关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示JFrame
frame.setVisible(true);
}
}
5.2.框架中添加组件
上述案例中的框架是空的.可以通过add方法在框架中添加组件
java.awt.Container.add(Componentcomp)
代码:
publicstaticvoidmain(String[]args){
//创建JFrame
JFrameframe=newJFrame("我的frame");
//创建按钮
JButtonbutton=newJButton("OK");
//向frame中添加一个按钮
frame.add(button);
//设置尺寸
frame.setSize(200,100);
//JFrame在屏幕居中
frame.setLocationRelativeTo(null);
//JFrame关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示JFrame
frame.setVisible(true);
}
运行程序,会显示上图所示窗口.调整窗口的大小,按钮都是显示在窗口的中央,并且占满整个框架.这是因为组件(本例就是按钮)是被布局管理器放到框架中的.默认布局管理器就是将按钮放到中央.
备注:
可以通过f.setVisible(false);隐藏窗体f.dispose();关闭窗口
设置图片:
setIconImage(Toolkit.getDefaultToolkit().createImage("png-0015.png"));
6.JoptionPane对话框
显示一个带有OK 按钮的模态对话框。
下面是几个使用showMessageDialog 的例子:
Java代码
JOptionPane.showMessageDialog(null,"错误信息提示","标题",JOptionPane.INFORMATION_MESSAGE); 效果如下:
Java代码
1.JOptionPane.showMessageDialog(jPanel, "提示消息", "标题",JOptionPane.WARNING_MESSAGE);
效果如下:
Java代码
1.JOptionPane.showMessageDialog(null, "提示消息.", "标题",JOptionPane.ERROR_MESSAGE);
Java代码
1.JOptionPane.showMessageDialog(null, "提示消息.", "标题",JOptionPane.PLAIN_MESSAGE);
1.2showOptionDialog
这个函数可以改变显示在按钮上的文字。
你还可以执行更多的个性化操作。
常规的消息框:
Java代码
1.int n = JOptionPane.showConfirmDialog(null, "你高兴吗?
", "标题",JOptionPane.YES_NO_OPTION);//i=0/1
效果如下:
输入框:
StringinputValue=JOptionPane.showInputDialog("请输入你给我金额");
7.面板(Panel)
面板也是一个容器的组件,可以在上面添加
注意:
面板不能单独使用,必须在顶层窗口中使用。
8.常见组件
一些常用的组件例如:
JLabel,
JButton,
JTextField
JPassworldField
JRadioButton
JCheckBox
JTextArea
JList
JMenuBar
JMenu
JMenultem
8.1.Button按钮
Java中的Swing提供了常规按钮,单选按钮,复选按钮和菜单按钮
8.1.1.JButtion普通按钮
按钮Button是点击时触发动作事件的组件.
8.1.2.JRadioButton单选按钮
单选按钮,可以让用户从一组选项中选择一个单一条目.例如性别.
使用单选按钮时注意将,单选按钮放在一组,需要使用java.swing.ButtonGroup.的add方法,添加到一个组中,位于同一个组的单选按钮就是互斥的.如果没有将单选按钮放在一个组中,就是独立的..我们让然需要把按钮添加在容器中.因为ButtonGroup添加到容器中..
8.1.3.JCheckBox复选框
多选
8.2.JLabel标签
8.3.JTextField文本域
8.4.JTextArea文本区域
8.5.JComboBox组合框
8.6.JList列表框
例如:
String[]data={"one","two","three"};
JListlist=newJList(data);
p1.add(list);
8.7.JmenuBar菜单条
JMenu菜单
JMenultem菜单项
菜单条(MenuBar)中包含菜单(Menu),菜单中中包含菜单项(MenuItem)
注意添加的顺序。
例如:
记事本的菜单条中包含文件、编辑、格式、查看、帮助菜单。
其中文件菜单中包含新建、打开、保存、另存为等菜单项
案例综合。
publicclassCommonComponentextendsJFrame{
publicCommonComponent(){
//面板
JPanelp1=newJPanel();
add(p1);
//标签
JLabelname=newJLabel("用户名:
");
p1.add(name);
//文本域
JTextFieldfield=newJTextField(8);
p1.add(field);
//标签
JLabelpasswd=newJLabel("密码");
p1.add(passwd);
//密码域
JPasswordFieldpass=newJPasswordField(8);
p1.add(pass);
//单选按钮
JLabelgender=newJLabel("性别");
p1.add(gender);
JRadioButtonmale=newJRadioButton("男");
JRadioButtonfemale=newJRadioButton("女");
//单选按钮组,同一个单选按钮组的互斥.
ButtonGroupgroup=newButtonGroup();
group.add(male);
group.add(female);
//注意,单选按钮组不能添加进容器
p1.add(male);
p1.add(female);
//复选框
JLabellike=newJLabel("爱好:
");
p1.add(like);
JCheckBoxeat=newJCheckBox("吃饭");
JCheckBoxmovie=newJCheckBox("看电影");
JCheckBoxsleep=newJCheckBox("睡觉");
p1.add(eat);
p1.add(movie);
p1.add(sleep);
//文本域
JLabelinfo=newJLabel("个人简介");
p1.add(info);
JTextAreaarea=newJTextArea(20,20);
p1.add(area);
//列表
String[]data={"one","two","three"};
JListlist=newJList(data);
p1.add(list);
//普通按钮
JButtonbutton=newJButton("注册");
p1.add(button);
//菜单条
JMenuBarbar=newJMenuBar();
//菜单
JMenumenu=newJMenu("文件");
//菜单选项
JMenuItemmyNew=newJMenuItem("新建");
JMenuItemmyOpen=newJMenuItem("打开");
bar.add(menu);
menu.add(myNew);
menu.add(myOpen);
add(bar,BorderLayout.NORTH);
}
publicstaticvoidmain(String[]args){
CommonComponentframe=newCommonComponent();
frame.setTitle("常用组件");
frame.setSize(400,400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//自适应
frame.pack();
frame.setVisible(true);
}
}
样式如下:
因为面板默认是流式布局.
9.布局管理器
Java的GUI组件都放置在容器中,他们的位置是由容器的布局管理器来管理的.在前面的程序中,并没有指定将OK按钮放置在框架的什么位置,但是,Java知道应该把它放置在哪里,因为在后台工作的布局管理器能够将组件放到正确的位置.布局管理器是使用布局管理器类创建的.
我们可以使用setLayout()方法在容器中设置布局管理器.
我们将要了解FlowLayoutGridLayoutBorderLayout
9.1.FlowLayout流式布局
FlowLayout(流式布局)是最简单布局管理器.Jpanel容器默认的布局管理器
流式布局,按照组件添加的顺序,从左到到右将组件排列在容器中.当放满一行,就开始新的一行.在FlowLayout有3个常量FlowLayout可以指定组件的对齐方式.
LEFT每一行组件都应该是左对齐的
RIGHT每一行组件都应该是右对齐的
CENTER每一行组件都应该是居中的
还可以指定组件之间的以像素为单位的间隔.
intgetHgap()
获取组件之间以及组件与Container的边之间的水平间隙。
intgetVgap()
获取组件之间以及组件与Container的边之间的垂直间隙。
voidsetHgap(inthgap)
设置组件之间以及组件与Container的边之间的水平间隙。
voidsetVgap(intvgap)
设置组件之间以及组件与Container的边之间的垂直间隙。
这个布局管理器的对其方式默认值是CENTER
这个布局管理器的水平间隔默认值是5个像素
这个布局管理器的垂直间隔默认是是5个像素
创建该布局管理器
FlowLayout()
构造一个新的FlowLayout,它是居中对齐的,默认的水平和垂直间隙是5个单位。
FlowLayout(intalign)
构造一个新的FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是5个单位。
FlowLayout(intalign,inthgap,intvgap)
创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。
案例:
创建框架,使用流失布局管理器.向该框架添加三个标签和文本域.
publicclassShowFlowLayoutextendsJFrame{
publicShowFlowLayout(){
super.setLayout(newFlowLayout(FlowLayout.LEFT,10,20));
add(newJLabel("姓名:
"));
add(newJTextField(8));
add(newJLabel("邮箱:
"));
add(newJTextField(8));
add(newJLabel("电话:
"));
add(newJTextField(8));
}
publicstaticvoidmain(String[]args){
ShowFlowLayoutframe=newShowFlowLayout();
frame.setTitle("FlowLayout");
frame.setSize(500,200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
该案例在本类main方法中创建了一个本类对象.该类的构造函数中创建并且添加组件.
该案例使用了FlowLayout管理器在框架放置组件.如果改变框架的大小.组建会自动的重新排列,以适应框架.
例如:
如果将同一个按钮在框架中添加10次,那么该框架只会出现一次,将一个按钮向容器中添加多以和一次是一样的.
9.2.GridLayout网格布局
GridLyaout是以网格形式管理组件的.组件按照他们添加的