GUI 图型界面的实现。
使用的主要包:
import javax.swing.*
与
import java.awt.*
容器:是用来容纳其他组件的特殊组件。
1 顶层容器:JFrame JApplet JDialog JWindow
2 中间容器:JPanel JScrollPane JSplitPane JDesktopPane JToolBar
3 特殊容器:JInternalFrame JLayeredPane JRootPane 在GUI中起特殊作用的中间层
注意:只有顶层容器可以独立的显示出来,其他容器需要放在顶层容器中才能显示出来。一个容器可以通过调用add()方法为该容器添加组件。为此Java引入了布局管理器(LayoutManager),来确定组件按照布局管理器的格式来布局。
创建 GUI 步骤
1 创建顶层容器。
2 指定容器的布局管理器。
3 用add()方法添加各种创建好的组件。
方法:
1 setTitle(String title) : 设置窗体标题也可在创建对象时作为参数命名。
2 setLayout(new 布局管理器类型): 创建布局管理器。
3 add(组件名称):添加组件。
4 setBounds(int x , int y , int width , int height) : 设置窗体的显示:x , y 显示的位置,width , height 窗体的大小。
5 setVisable(Boolean b):设置窗体是否显示。
6 setDefaultCloseOperation(int operation) :
a: “0”或JFrame
.
DO_NOTHING_ON_CLOSE:不执行任何操作。
b: “1”或JFrame
.
HIDE_ON_CLOSE:隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏
c: “2”或JFrame
.
DISPOSE_ON_CLOSE:隐藏并释放该窗体。但继续运行应用程序,释放了窗体中占用的资源。
d: “3”或JFrame
.
EXIT_ON_CLOSE: 使用 System exit 方法退出应用程序。
例:
import java.awt.*;
import javax.swing.*;
public class Test{
public static void main(String[] args) throws Exception{
JFrame frame = new JFrame("My name is JFrame");//创建对象,并命名与setTitle方法相同
frame.setLayout(new BorderLayout());//设置布局格式
JButton button = new JButton();//创建按钮对象
frame.add(button);//添加按钮对象
frame.setBounds(300,200,400,200);//出现的位置与大小
frame.setVisible(true);//是否可见
frame.setDefaultCloseOperation(3);//退出的方式 与JFrame.EXIT_ON_CLOSE 相同
}
中间容器:面板 JPanel JScrollPane JSplitPane
1 如果不使用面板,则只有一种布局管理器,无法实现分区与分块。
2 一些布局格式只能放有限个组件,无法满足需求通过面板可以增加组件量。
3 可以引入带滚动条(JScrollPane)和可分割(JSplitPane)的面板。
例 JPanel
import java.awt.*;
import javax.swing.*;
public class Test{
public static void main(String[] args) throws Exception{
//顶层容器的设计
JFrame frame = new JFrame("使用JPanel");
frame.setLayout(new BorderLayout());
frame.setBounds(500,200,400,200);
frame.setDefaultCloseOperation(3);
//中间容器的上层对象设计
JPanel topPanel = new JPanel();
frame.add(topPanel,BorderLayout.NORTH);
JLabel show = new JLabel("请输入姓名");//创建提示标签
JTextField input = new JTextField();//创建输入框
input.setEditable(true);//输入框设置为可编辑
input.setHorizontalAlignment(SwingConstants.LEFT);//输入框格式设计
input.setColumns(20);//输入框的列数设置
JButton button = new JButton("提交");//创建提交按钮
topPanel.add(show);
topPanel.add(input);
topPanel.add(button);
//中间容器的下层对象设计
JPanel bottomPanel = new JPanel();
frame.add(bottomPanel,BorderLayout.CENTER);
JLabel show2 = new JLabel("显示所有输入姓名:");//创建提式标签
JTextArea output = new JTextArea();//创建输出框
output.setRows(5);//输出框行数设置
output.setColumns(32);//输出框列数设置
output.setEditable(false);//输出框设置为禁止编辑
bottomPanel.add(show2);
bottomPanel.add(output);
//最后设置能否可见
frame.setVisible(true);
}
效果图
注意:最后在写setVisible否则组件无法一开始就显示出来。
JScrollPane提供4个常用方法:
1 setViewportView( Component view ): 设置在滚动面板中的显示的组件对象。
2 setWheelScrollingEnabled(boolean arge):设置滚动面板的滚动条是否支持鼠标的滚动轮。
3 setHorizontalScrollBarPolicy(int policy):设置水平滚动条的显示策略。
4 setVerticalScrollBarPolicy(int policy):设置垂直滚动条的显示策略。
JSplitPane提供4个常用方法:
1 setOrientation(int orientation):用于设置面板分割方式即水平分割参数(HORIZNTAL_SPLIT)垂直分割(VERTICAL_SPLIT)。
2 setDividerLocation(double proportionalLocatio):用于设置面板的分割比例,即左右或上下的区域占比。
3 setLeftComponent(Component comp):为面板左侧(或上侧)添加组件。
4 setRightComponent(Component comp):为面板右侧(或下侧)添加组件。
布局: java.awt.*
1 使用布局管理器,则其对应的各组件的大小位置已经被布局管理器所管理,用户无法设置这些属性。
2 如果用户想自己控制组件的大小和位置,可取消布局管理器,即调用 setLayout(null) 将布局管理器设置为空。
布局管理器:
1 若不使用 setLayout(null) 则 setBounds(int x , int y , int width , int height) ,可以设置组件在容器中的位置,大小。
import javax.swing.*;
import java.awt.*;
public class Test{
public static void main(String[] args) {
JFrame frame = new JFrame("未使用布局管理器");
frame.setDefaultCloseOperation(3);
frame.setLayout(null);//不适用布局管理器
//创建用户标签并设置其起始位置与大小
JLabel label = new JLabel("用户名:");
label.setBounds(40,20,80,30);
//创建用户名输入框,并设置起始位置与大小
JTextField textField = new JTextField();
textField.setEditable(true);//能否输入
textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
textField.setColumns(20);//20列
textField.setBounds(100,20,120,30);
//创建登录按钮,并设置起始位置与大小
JButton button = new JButton("登录");
button.setBounds(130,60,60,30);
//添加到容器
frame.add(label);
frame.add(textField);
frame.add(button);
//设置容器的大小并显示
frame.setBounds(400,200,300,160);
frame.setVisible(true);
}
效果图:
2 边界布局管理器 :BorderLayout
JFrame默认的布局管理器,将容器划分为5个部分:容器顶层(NORTH),容器底层(SOUTH),容器中心(CENTER),容器左侧(WEST),容器右侧(EAST)。可通过add方法控制其位置 : frame.add(northLabel , BorderLayout
.
NORTH); 来控制其位置。 此外还有setHgap(int hgap) 与setVgap(int vgap)来设置,各区域水平与垂直距离,以像素为位。
import javax.swing.*;
import java.awt.*;
public class Test{
public static void main(String[] args) {
JFrame frame = new JFrame("使用边界布局管理器");
frame.setDefaultCloseOperation(3);
frame.setLayout(new BorderLayout());//使用边界布局管理器
//创建用户标签并设置其起始位置与大小
JLabel label = new JLabel("用户名:");
label.setBounds(40,20,80,30);//不在起作用
//创建用户名输入框,并设置起始位置与大小
JTextField textField = new JTextField();
textField.setEditable(true);//能否输入
textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
textField.setColumns(20);//20列
textField.setBounds(100,20,120,30);//不在起作用
//创建登录按钮,并设置起始位置与大小
JButton button = new JButton("登录");
button.setBounds(130,60,60,30);//不在起作用
//添加到容器
frame.add(label,BorderLayout.NORTH);//容器顶层
frame.add(textField,BorderLayout.CENTER);//容器中心
frame.add(button,BorderLayout.SOUTH);//容器底层
//设置容器的大小并显示
frame.setBounds(400,200,300,160);
frame.setVisible(true);
}
效果图:
3 顺序布局 : FlowLayout
JPanel默认的布局管理器,布局策略:在一行上排列组件,当该行没有足够的空间时,则换行显示,当容器的大小改变时,组件将自动重排。该类默认居中显示,但可通过setAlignment(int aling)方法来设置对其方式,即参数:(LEFT) 靠左显示,(RIGHT) 靠有显示,(CENTER)默认居中显示。同样还有setHgap(int hgap) 与setVgap(int vgap)来设置,各区域水平与垂直距离。
import javax.swing.*;
import java.awt.*;
public class Test{
public static void main(String[] args) {
JFrame frame = new JFrame("使用顺序布局管理器");
frame.setDefaultCloseOperation(3);
frame.setLayout(new FlowLayout());//使用顺序布局管理器
//创建用户标签并设置其起始位置与大小
JLabel label = new JLabel("用户名:");
label.setBounds(40,20,80,30);//不在起作用
//创建用户名输入框,并设置起始位置与大小
JTextField textField = new JTextField();
textField.setEditable(true);//能否输入
textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
textField.setColumns(20);//20列
textField.setBounds(100,20,120,30);//不在起作用
//创建登录按钮,并设置起始位置与大小
JButton button = new JButton("登录");
button.setBounds(130,60,60,30);//不在起作用
//添加到容器
frame.add(label);
frame.add(textField);
frame.add(button);
//设置容器的大小并显示
frame.setBounds(400,200,300,160);
frame.setVisible(true);
}
效果图:
4 网格布局:GridLayout
使容器中的各组件呈M行×N列的网格状分布。各组件的排列方式为:从上到下,从左到右。设置网格布局行数和列数时,行数或者列数可以有一个为零。构造方法:GridLayout(int rows, int clos) a 若 (rows > 0 , cols = 0);容器将先按行排列组件,当组件数>rows时自动增加一列; b 若 (rows = 0 , cols > 0);容器将先按列排列组件,当组件数>cols时自动增加一行; c 若 (rows > 0 , clos > 0);容器将先按行排列组件,当组件数>rows时自动增加一列; 同样还有setHgap(int hgap) 与setVgap(int vgap)来设置,各区域水平与垂直距离。
import javax.swing.*;
import java.awt.*;
public class Test{
public static void main(String[] args) {
JFrame frame = new JFrame("使用网格布局管理器");
frame.setDefaultCloseOperation(3);
frame.setLayout(new GridLayout(2,2));//使用网格布局管理器
//创建用户标签并设置其起始位置与大小
JLabel label = new JLabel("用户名:");
label.setBounds(40,20,80,30);//不在起作用
//创建用户名输入框,并设置起始位置与大小
JTextField textField = new JTextField();
textField.setEditable(true);//能否输入
textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
textField.setColumns(20);//20列
textField.setBounds(100,20,120,30);//不在起作用
//创建登录按钮,并设置起始位置与大小
JButton button = new JButton("登录");
button.setBounds(130,60,60,30);//不在起作用
//添加到容器
frame.add(label);
frame.add(textField);
frame.add(button);
//设置容器的大小并显示
frame.setBounds(400,200,300,160);
frame.setVisible(true);
}
效果图:
5 卡片布局CardLayout
布局策略:将容器分为若干层,将个组件按层放入,每次只能看到一层,在调用add()方法添加组件时,除了提供组件对象外,第二个参数要为组件指定一个字符串名称。若要查看某一个组件,可调用show(frame
.
getContentPane() , String name)方法查看。还提供了next , previous , first , last用于控制查看的次序。通常会将面板按照卡片布局插入。