Java图形用户界面:
swing与AWT:
AWT:抽象窗口工具箱,适合于开发简单的图形用户界面,很可能产生与特定平台相关的故障,它是一个重量级组件
swing库是AWT的一个取代,这个组件更少的依赖于目标平台并且更少的使用自己的GUI资源,它是一个轻量级组件
Java GUI API:
它包含的类可以分为三组:组件类、容器类、辅助类
组件类:用来创建用户界面的
容器类:用来包含其它组件的
辅助类:用来支持GUI组件的
组件类的实例是可以显示在屏幕上的,JComponent类是所有轻量级Swing组件类的根类,它是一个抽象类是不能创建实例的
容器类Container的实例可以包含Componentp实例,它是用来盛装GUI组件的GUI组件,Swing中可以使用的容器类:
javax.swing.JFrame:用来存放Swing用户界面不能包含在另一个窗口中的窗口
javax.swing.JPane:用来存放用户界面组件的不可见容器
javax.swing.JApplet
javax.swing.JDialog:一个弹出式窗口或消息框,一般用来接收来自用户的附加信息或是通知事件发生的临时窗口
GUI辅助类:在包java.awt当中
Graphics,Color,Font,FontMetrics,Dimension,LayoutManager
创建一个用户界面需要创建一个框架或一个applet来存放用户界面组件
创建一个框架:使用JFrame类来创建框架
import javax.swing.JFrame;
publicclass MyFrame {
publicstaticvoid main(String[] args) {
// 创建一个框架
JFrame frame = new JFrame("MyFrame");
// 设置框架的大小
frame.setSize(400, 300);
// 使用这个框架居中,传入参数null
frame.setLocationRelativeTo(null);
// 设置关闭按钮的动作为半闭框架并退出
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示框架
frame.setVisible(true);
}
}
注意框架直到调用了setVisible(true)才会显示
frame.setSize(400, 300);这个表示设定框架的大小是宽400px,高300px,如果没有设定框架的大小则框架的大小就只够显示标题栏
frame.setLocationRelativeTo(null);这个会使用框架在屏幕中居中显示
注意:应该在frame.setLocationRelativeTo(null);这个居中显示前先设定窗口的大小这样的才能算出窗口居中要显示的正确的位置,不然的话是先以最小的大小居中再把窗口按指定大小显示就不是整个窗口真正的居中了!
向框加当中添加一个组件:
import javax.swing.JButton;
import javax.swing.JFrame;
publicclass MyFrameWithComponents {
publicstaticvoid main(String[] args) {
JFrame frame = new JFrame("MyFrmae");
// 创建一个Button组件
JButton jbOK = new JButton("确定");
// 把组件添加到框架当中
frame.add(jbOK);
// 设定框架的大小、位置...
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
理论上是把这个组件添加到内容窗格中,每个JFrame都包含一个内容窗格(java.awt.Container)
移除一个组件使用remove()方法
布局管理器:
在许多的窗口系统中都是使用硬代码来实现组件的排放的,这样可能导致的问题是在一个系统中界面好看但到另一个系统中界面就乱了Java使用布局管理器来提供一种层面的抽象,自动把用户界面映射到所有窗口系统中
Java的GUI组件都是放在容器中的,它们的位置是使用布局管理器来管理的。
setLayout(aLayoutManager)方法可以在容器中设置布局管理器
FlowLayout布局管理器:
按组件的添加顺序把组件从左到右排列在容器当中,当放满了一行就开始新的一行。
java.awt.FlowLayout
alignment:指定组件的对齐方式默认是center
hgap:指定水平间隔默认是5px
vgap:指定垂直间隔默认是5px
构造方法:
FlowLayout()
FlowLayout(int alignment)
FlowLayout(int alignment,int hgap,int vgap)
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
publicclass TestFlowLayout extends JFrame {
// 构造方法
public TestFlowLayout() {
// 设置FlowLayout,对齐方式是左对齐,水平10px,垂直20px
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));
// 添加相应的组件
add(new JLabel("姓:"));
add(new JTextField(8));
add(new JLabel("名字:"));
add(new JTextField(8));
}
publicstaticvoid main(String[] args) {
TestFlowLayout frame = new TestFlowLayout();
frame.setTitle("FlowLayout");
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
这里把TestFlowLayout从JFrame扩展,并直接在其构造方法中完成了各组件的添加及设定了布局管理器
创建一个GUI应用程序必然要创建一个框架,所直接想到JFrame并从它扩展
有了这么一个类那这个类可以很容易进行重用创建出多个框架
大多数情况下GUI主类都是从JFrame扩展,并在这个构造方法中创建用户界面,在main中或是其它的客户类中创建这个类的实例然后显示这个框架。
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));注意这一句在设置布局管理器的时候是要一个管理器的对象的因而要在外选创建一个管理器对象或是直接在这里new一般常用的方法是直接在这里new出一个对象
如果是同一个按钮在一个容器中只能出现一次所以把一个按钮向一个容器添加多次只会显示一个按钮与只添加一次是没有区别的。
GridLayout布局管理器
GridLayout是以网格的形式来管理组件的,组件按照添加的顺序从左到右排列先是第一行再是第二行…
行数和列数:可以为0,但是不能两个都是0,如是本个为0一个不为0则不为0的行或是列的数量是固定的为0的则由布局管理器动态决定。如果行和列数都是不为0的则行为固定的列会由布局管理器态生成
rows:行数,默认1
colums:列数,默认1
hgap:水平间隔,默认0
vgap:垂直间隔,默认0
GridLayout()默认构造方法
GridLayout(int rows,int column)
GridLayout(int rows,int column,int hgap,int vgap)
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
publicclass TestGridLayout extends JFrame {
public TestGridLayout() {
// 设置布局管理器为网格管理器,2行2列水平垂直都是间隔5px
setLayout(new GridLayout(2, 2, 5, 5));
// 添加相应的组件
add(new JLabel("姓:"));
add(new JTextField(8));
add(new JLabel("名字:"));
add(new JTextField(8));
}
publicstaticvoid main(String[] args) {
TestGridLayout frame = new TestGridLayout();
frame.setTitle("GridLayout");
frame.setSize(200, 90);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
对于FlowLayout和GridLayout这两个布局管理器来说在添加组件时的顺序会很重要这决定了组件在容器中出现的位置
BorderLayout布局管理器
BorderLayout把容器分为五个区域:东、西、南、北、中
使用add(Component,index)可以把组件添加到BorderLayout当中,这里index是一个常量其取值为BorderLayout.EAST,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.NORTH,BorderLayout.CENTER
hgap:水下间隔,默认是0
vgap:垂直间隔,默认是0
构造器
BorderLayout()
BorderLayout(int hgap,int vgap);
组件会根据它它们最为合适的尺寸和它们在容器的位置来放置。东、西、南、北可以垂直拉伸不可水平拉伸,中间的可以垂直和水平拉伸
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
publicclass TestBorderLayout extends JFrame {
public TestBorderLayout() {
setLayout(new BorderLayout(5, 10));
add(new JButton("东"), BorderLayout.EAST);
add(new JButton("南"), BorderLayout.SOUTH);
add(new JButton("西"), BorderLayout.WEST);
add(new JButton("北"), BorderLayout.NORTH);
add(new JButton("中"), BorderLayout.CENTER);
}
publicstaticvoid main(String[] args) {
TestBorderLayout frame = new TestBorderLayout();
frame.setTitle("BorderLayout");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
使用BorderLayout可以指定组件放置的位置,注意放置的位置有一个默认值就是中间也就是说在使用add方法时如果只有一个组件参数的话则会放到中间
布局管理器的属性:
布局管理器中的属性是可以改变的,如果在设置了布局管理器后还要改变这些属性的话则要先把创建的布局管理器使用一个变量引用,在之后使用这个引用去调用相应的set方法就可以了
面板:
面板是一个子容器可以在面板上放置各个组件,在Java GUI程序中常常会把一个窗口分成几个面板,然后在各个面板中加上相应的组件就可以了,最后把这个面板加到框架中去。
Swing中的面板是JPanel
使用new JPanel()可以创建一个默认的FlowLayout管理器面板
new JPanel(LayuotMananger)创建一个带特定布局管理器的面板
可以向面板加加上组件也是使用add(组件对象)
面板可以放到一个框架当中也可以放到另一个面板当中
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
publicclass TestGridLayout extends JFrame {
public TestGridLayout() {
// 设置布局管理器为网格管理器,2行2列水平垂直都是间隔5px
setLayout(new GridLayout(2, 2, 5, 5));
// 添加相应的组件
add(new JLabel("姓:"));
add(new JTextField(8));
add(new JLabel("名字:"));
add(new JTextField(8));
}
publicstaticvoid main(String[] args) {
TestGridLayout frame = new TestGridLayout();
frame.setTitle("GridLayout");
frame.setSize(200, 90);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Color类:
java.awt.Color类为GUI组件件设置颜色,这个颜色是由三原色红、绿、蓝三原色组成,每一种原色由一个int值表示它的深度值(0~255)
创建一个Color对象
public Color(int r,int g,int b)
这里r,g,b的取值范围都是在0~255之间的,可以对一个组件设置背景色和前景色
setBackground(Color c)
setForeground(Color c)
java.awt.Color也定义了一些颜色的常量,这时类库中定义好的一些颜色
Font类:
java.awt.Font类可以创建一种字体,然后在组件中使用setFont(Font f)设置组件的字体
public Font(String name,int style,int size);
第一个参数表示的是一种字体名,第二个参数表示的是一种风格,第三个参数表示字体的大小
Swing GUI组件的公共特性:
Component类是GUI组件和容器的根类,所有的Swing GUI组件除了JFrame,JApplet,JDialog不是外其它都是JComponent类的子类
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class TestSwingGUI extends JFrame{
public TestSwingGUI(){
//创建一个面板
JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEFT,2,2));
JButton jbtLeft = new JButton("Left");
JButton jbtCenter = new JButton("Center");
JButton jbtRight = new JButton("Right");
//设置组件的颜色
jbtLeft.setBackground(Color.WHITE);
jbtCenter.setForeground(Color.GREEN);
//设置组件的提示信息
jbtRight.setToolTipText("右边的按钮");
//把组件加到p1这个面板当中
p1.add(jbtLeft);
p1.add(jbtCenter);
p1.add(jbtRight);
//设置p1面板的边界,并加上边框文本
p1.setBorder(new TitledBorder("三个按钮"));
//设置文本和边界线
Font largeFont = new Font("TimesRoman",Font.BOLD,20);
Border lineBorder = new LineBorder(Color.BLACK,2);
//再创建一个面板p2
JPanel p2 = new JPanel(new GridLayout(1,2,5,5));
JLabel jlblRed = new JLabel("红色");
JLabel jlblOrange = new JLabel("橙色");
jlblRed.setForeground(Color.RED);
jlblOrange.setForeground(Color.ORANGE);
jlblRed.setFont(largeFont);
jlblOrange.setFont(largeFont);
//设置边界
jlblRed.setBorder(lineBorder);
jlblOrange.setBorder(lineBorder);
p2.add(jlblRed);
p2.add(jlblOrange);
p2.setBorder(new TitledBorder("二个标签"));
setLayout(new GridLayout(2,1,5,5));
add(p1);
add(p2);
}
public static void main(String[] args) {
JFrame frame = new TestSwingGUI();
frame.setTitle("GUI");
frame.setSize(300,150);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
图标:
图标是一个固定大小的图片,一般来说它是比较小的用来装饰组件
Java支持三种图像格式:GIF,JPEG,PNG
要使用图标可以如下:
先创建一个图标对象:
ImageIcon icon = new ImageIcon(“image/a.gif”);
这就是在当路径的image目录中找到a.gif创建这样一个图标对象,注意在Windows系统中文件名是不区分大小写的,unix系统中是区分大小写的
接下来在组件中显示图标
使用new JLabel(icon);或new JButton(icon)来把这个图标在标签或是按钮上显示出来