Java(09)界面编程
一.三层设计
1.1.三个层
1.表示层
用户界面类
2.事务逻辑层
问题域类
3.数据访问层
数据访问类
1.2.高内聚与低耦合
1.高内聚
每层专注做好自己的工作
2.低耦合
层间做好数据接口
二.GUI类基础概念
2.1.界面组成
1.组件
container
2.布局
Layout
3.事件收发
Message
4.事件处理
Process
2.2.界面介绍
2.3.常用包
1.AWT
- 依赖于本地代码,重量级组件
import java.awt.*;
2.Swing
- 轻量级
import javax.swing.*;
2.4.体系结构
三.swing三层介绍
3.1.框架
1.三层
- 顶层容器:整体的钢筋混凝土架构
- 中间层:若干单元,多套住房
- 原子组件:住房内的具体元素
3.2.常见顶层容器
1.JFrame
带有标题行和控制按钮
最常用
2.JApplet
包含在浏览器窗口中
3.JDialog
对话框,没有控制按钮
4.JWindow
没有标题,没有控制按钮
3.3.常见中间容器
要放在顶层容器里面才能用
1.JPanel
常见的
2.JScrollPane
具有滚动条的
3.JSplitPane
具有拆分功能的
4.JTabbedPane
具有若干标签的
5.JToolBar
显示常用控制的容器,按行,列排列
3.4.常见原子组件
四.原子组件介绍
1.JButton(按钮)
class Test extends Frame{
JButton jbt1;
JButton jbt2;
public Test(){
// Frame的方法
// 设置大小
setBounds(200,200,400,400);
// 新建并设置显示的内容
jbt1 = new JButton("新建");
jbt1.setBounds(50,50,25,25);
jbt2 = new JButton("退出");
jbt2.setBounds(150,150,25,25);
// 添加内容
this.add(jbt1);
this.add(jbt2);
// 设置可见
setVisible(true);
}
}
2.JTextField(文本框)
输入框
1.常见方法
方法 | 说明 |
---|---|
JTextField() |
|
JTextField() |
|
setText() |
|
getText() |
3.JPasswordField(密码框)
4.JTextArea
显示多行文本
1.常见方法
方法 | 说明 |
---|---|
JTextArea() |
|
setText() |
|
getText() |
5.JLabel(标签)
标签
1.常见方法
方法 | 说明 |
---|---|
JLabel() |
|
setAlignment |
设置对齐方式,有Jlabel.LEFT ,Jlabel.CENTER ,Jlabel.RIGHT |
6.Jlist(列表框)JComboBox(下拉框)JScrollPane(滚动窗格)
1.常见方法
方法 | 说明 |
---|---|
JList() |
|
JList(object data[]) |
|
getSelectedIndex |
获取索引 |
getSelectedValue |
获取值 |
2.代码
class ComboBoxGUI extends JFrame{
//定义组件
JPanel jpanel1,jpanel2;
JLabel jlabel1,jlabel2;
JComboBox jcomboBox;
JList jlist;
JScrollPane jscrollPane;
public ComboBoxGUI() {
//创建组件
jpanel1 = new JPanel();
jpanel2 = new JPanel();
jlabel1 = new JLabel("你的籍贯:");
jlabel2 = new JLabel("旅游地点:");
//构造信息
String [] jcomboBoxText = {
"北京","上海","广州","南京","武汉","天津"};
jcomboBox = new JComboBox(jcomboBoxText);
String [] JlistText = {
"九寨沟","故宫","长城","海南","木兰天池","荷兰"};
jlist = new JList(JlistText);
//滚动条
//希望显示多少项,3项
jlist.setVisibleRowCount(3);
//放在滚动面板
jscrollPane = new JScrollPane(jlist);
this.setLayout(new GridLayout(2,1));
jpanel1.add(jlabel1);
jpanel1.add(jcomboBox);
jpanel2.add(jlabel2);
//添加滚动条
jpanel2.add(jscrollPane);
this.add(jpanel1);
this.add(jpanel2);
//设置窗口
this.setTitle("用户调查");
//窗口大小
this.setSize(300,200);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//显示
this.setVisible(true);
}
}
7.JRadioButton(单选框)JCheckBox(复选框)
1.说明
2.代码
class Register extends JFrame {
JPanel panel1,panel2,panel3;
JLabel label1,label2;
JButton button1,button2;
//多选
JCheckBox checkBox1,checkBox2,checkBox3;
//单选
JRadioButton radioButton1,radioButton2;
//要加一个限制
ButtonGroup buttonGroup;//单选按钮组
public Register() {
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
label1 = new JLabel("你喜欢的运动");
label2 = new JLabel("你的性别");
button1 = new JButton("注册用户");
button2 = new JButton("取消注册");
checkBox1 = new JCheckBox("足球");
checkBox2 = new JCheckBox("篮球");
checkBox3 = new JCheckBox("乒乓球");
radioButton1 = new JRadioButton("男");
radioButton2 = new JRadioButton("女");
//要radioButton1,radioButton2结合
buttonGroup = new ButtonGroup();
buttonGroup.add(radioButton1);
buttonGroup.add(radioButton2);
//设置布局
this.setLayout(new GridLayout(3,1));
//添加组件
//panel默认是流式布局
panel1.add(label1);
panel1.add(checkBox1);
panel1.add(checkBox2);
panel1.add(checkBox3);
panel2.add(label2);
//这里不是添加buttonGroup
panel2.add(radioButton1);
panel2.add(radioButton2);
panel3.add(button1);
panel3.add(button2);
this.add(panel1);
this.add(panel2);
this.add(panel3);
//设置窗口
this.setTitle("注册");
//窗口大小
this.setSize(300,150);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//显示
this.setVisible(true);
}
}
五.容器Container
5.1.用途
- 容纳组件
- 特殊的组件
5.2.JFrame
窗口,默认是边界布局
1.常见方法
方法 | 说明 |
---|---|
setSize() |
设置大小 |
setVisible(true) |
设置可见 |
Container getContentPane() |
获得swing 窗口的组件 |
setTitle |
设置标题 |
2.举例
class Hello_Swing_GUI extends JFrame{
//定义组件
//标签
JLabel message_lab01;
//文本框
JTextField message_text01;
//按钮
JButton ok_btn01;
//----------------------
//构造方法
public Hello_Swing_GUI(){
//创建组件
//并有显示的文本
message_lab01 = new JLabel("Message:");
//文本框的长度为10
message_text01 = new JTextField(10);
//按钮
ok_btn01 = new JButton("OK");
//设置窗口组件布局
//流式布局
this.setLayout(new FlowLayout());
//添加组件到容器
this.add(message_lab01);
this.add(message_text01);
this.add(ok_btn01);
//显示窗体
//设置标题
this.setTitle("组件显示");
//设置窗体,左上角是(1,1)
this.setSize(300,100);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//显示
this.setVisible(true);
}
}
3.窗体显示正中间
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
4.退出关闭控制台
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
5.禁止修改窗体大小
//静止窗体大小修改
this.setResizable(false);
5.3.Jpanel
面板
默认是流式布局
1.常见方法
方法 | 说明 |
---|---|
Jpanel() |
创建面板对象 |
Jpanel(LayoutManager layout) |
创建具有指定布局管理器的面板 |
2.举例
class Layout_GUI extends JFrame{
Layout_GUI(){
//定义组件
JPanel panel1,panel2;
JButton [] button_artay = new JButton[6];
//文本框
JTextField message_text;
//创建组件
panel1 = new JPanel();
panel2 = new JPanel();
message_text = new JTextField("请输入");
String button_name[] = {
"苹果","葡萄","桔子",
"香蕉","荔枝","西瓜"};
for(int i=0;i<button_artay.length;i++){
button_artay[i] = new JButton(button_name[i]);
}
//添加组件
panel1.add(button_artay[0]);
panel1.add(button_artay[1]);
panel2.add(button_artay[2]);
panel2.add(button_artay[3]);
panel2.add(button_artay[4]);
panel2.add(button_artay[5]);
this.setLayout(new BorderLayout());
//上下
this.add(panel1,BorderLayout.NORTH);
this.add(panel2,BorderLayout.SOUTH);
this.add(message_text,BorderLayout.CENTER);
//设置窗口
this.setTitle("综合布局");
//窗口大小
this.setSize(300,200);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//显示
this.setVisible(true);
}
}
5.4.JDialog
对话框,提示信息用的
默认是边界布局
六.布局管理
6.1.常见的布局
1.边界布局(BorderLayout)
2.流式布局(FlowLayout)
3.网格布局(GridLayout)
4.卡片式布局(CardLayout)
5.网格包布局(GridBagLayout)
6.2.边界布局
1.均分5个区域
中央,东西南北
2.六个步骤
- 继承JFrame
- 定义组件
- 创建组件
- 添加组件
- 设置窗体
- 设置显示
3.举例
class Border_Layout_GUI extends JFrame{
//定义组件
JButton button1,button2,button3,button4,button5;
public Border_Layout_GUI(){
//全部都在构造方法里面
button1 = new JButton("中");
button2 = new JButton("东");
button3 = new JButton("南");
button4 = new JButton("西");
button5 = new JButton("北");
//添加组件
//因为没有设置layout所以要指定位置,默认是边界布局
this.add(button1,BorderLayout.CENTER);
this.add(button2,BorderLayout.EAST);
this.add(button3,BorderLayout.SOUTH);
this.add(button4,BorderLayout.WEST);
this.add(button5,BorderLayout.NORTH);
//设置窗口
this.setTitle("边界布局");
//窗口大小
this.setSize(300,200);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//静止窗体大小修改
this.setResizable(false);
//显示
this.setVisible(true);
}
}
6.3.网格布局
1.说明
2.举例
class GridLayout_GUI extends JFrame{
public GridLayout_GUI(){
//定义组件
int button_size = 9;
JButton [] button_array = new JButton[button_size];
//创建组件
for(int i=0;i<button_array.length;i++){
//把值转换为字符串
button_array[i] = new JButton(String.valueOf(i+1));
}
//设置布局
//3-3列,10为行距
//前面2个参数是3行3列
//后面说明上下左右间距是10
this.setLayout(new GridLayout(3,3,10,10));
//添加组件
for(int i=0;i<button_array.length;i++){
this.add(button_array[i]);
}
//设置窗口
this.setTitle("网格布局");
//窗口大小
this.setSize(300,200);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//显示
this.setVisible(true);
}
}
6.4.流式布局
1.说明
按照加入的顺序,一行行排列
2.举例
class FlowLayout_GUI extends JFrame{
public FlowLayout_GUI(){
//定义组件
//多个按钮可以用一个数组
//要指定大小的!
JButton [] button_array = new JButton[6];
//按钮的名字
String [] button_name = {
"1","2","3","4","5","6"};
for(int i=0;i<button_array.length;i++){
button_array[i] = new JButton(button_name[i]);
}
//设置布局
//流式布局
this.setLayout(new FlowLayout());
//添加组件
for (int i=0;i<button_array.length;i++){
this.add(button_array[i]);
}
//设置窗口
this.setTitle("流式布局");
//窗口大小
this.setSize(300,200);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//显示
this.setVisible(true);
}
}
3.注意
- 不限制组件的大小
- 容器被缩放时候,组件位置可能变化了
- 默认是居中对齐的
6.5例子
1.用户登录
1.界面
2.代码
class Login_GUI extends JFrame{
public Login_GUI(){
//定义组件
JLabel label1,label2;
//用户名
JTextField username_text;
//密码
JPasswordField password_text;
//按钮
JButton button1,button2;
JPanel panel1,panel2,panel3;
//创建组件
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
label1 = new JLabel("用户名");
label2 = new JLabel("密 码");
//要设置长度的
username_text = new JTextField(10);
password_text = new JPasswordField(10);
button1 = new JButton("登录");
button2 = new JButton("取消");
//设置布局
this.setLayout(new GridLayout(3,1,5,5));
panel1.add(label1);
panel1.add(username_text);
panel2.add(label2);
panel2.add(password_text);
panel3.add(button1);
panel3.add(button2);
this.add(panel1);
this.add(panel2);
this.add(panel3);
// this.add(button2);
//设置窗口
this.setTitle("用户登录");
//窗口大小
this.setSize(300,150);
//设置窗体关闭时候,保证JVM要退出就是控制台
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取你的屏幕的宽和高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
//然后设置你编写的窗口的初始位置,也就是在中间,
this.setLocation(width / 2 - 200, height / 2 - 150);
//显示
this.setVisible(true);
}
}