文章目录
- P1 使用awt和swing设计窗口
- P2 控件类
- 1 所使用控件类用法
- (1) 主窗口 JFrame类
- (2) 标签 JLabel类
- (3) 字体 Font类 颜色 Color类
- (4) 画板 JPanel类
- (5) 五方布局 BorderLayout类
- (6) 流式布局 FlowLayout类
- (7) 文本框 JTextField类
- (8) 密码框 JPasswordField类
- (9) 单选按钮 JRadioButton类
- (10) 按钮组 ButtonGroup类
- (11) 下拉列表 JComboBox类
- (12) 标题框 TitledBorder类
- (13) 复选框 JCheckBox类
- (14) 滚动框 JScrollPane类
- (15) 文本区 JTextArea类
- (16) 列表默认内置数据 DefaultListModel类
- (17) 列表 List类
- P3 总结
P1 使用awt和swing设计窗口
最终效果:
窗口类变量:
//学生爱好
private static final String[] hobbyContext = {
"足球", "篮球", "排球", "棒球", "看书",
"听歌", "游泳", "跑步", "爬山", "旅行"
};
//主窗口
private JFrame jfrmMain;
//学生信息录入
private JTextField jtxtName;
private JPasswordField jpsdPassWord;
private JRadioButton jrbtMan;
private JRadioButton jrbtWoman;
private JLabel jlblStuPhoto;
private JComboBox<Integer> jcmbYear;
private JComboBox<Integer> jcmbMonth;
private JComboBox<Integer> jcmbDate;
private JPanel jpnlHobbyOutter;
private List<JCheckBox> jckbHobbies;
private JButton jbtnHobbyAll;
private JButton jbtnHobbyRev;
private JButton jbtnHobbyRst;
private JScrollPane jscpIntroduce;
private JTextArea jtatIntroduce;
//学生列表
private DefaultListModel<String> dlmStudentList;
private JList<String> jlstStudentlist;
private JScrollPane jscpStuList;
private JLabel jlblStuAcoount;
//功能按钮
private JButton jbtnAdd;
private JButton jbtnModify;
private JButton jbtnRemove;
private JButton jbtnExit;
1 初始化主窗口
/**
* 主窗口初始化
*/
this.jfrmMain = new JFrame("学生信息管理界面");
this.jfrmMain.setSize(width, height);
this.jfrmMain.setLocationRelativeTo(null);
this.jfrmMain.setLayout(new BorderLayout());
this.jfrmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2 主窗口布局设置
/**
* 五方布局初始化
* 北方 主标题,西方,东方填充空标签,南方填充按钮画板
* 中央填充栅格1行2列画板
*/
JLabel jlblTopic = new JLabel("学生信息界面", JLabel.CENTER);
jlblTopic.setFont(topicFont);
jlblTopic.setForeground(topicColor);
this.jfrmMain.add(jlblTopic, BorderLayout.NORTH);
JLabel jlblWestBlank = new JLabel(" ");
this.jfrmMain.add(jlblWestBlank, BorderLayout.WEST);
JLabel jlblEastBlank = new JLabel(" ");
this.jfrmMain.add(jlblEastBlank, BorderLayout.EAST);
JPanel jpnlSouthButton = new JPanel(new FlowLayout());
this.jfrmMain.add(jpnlSouthButton, BorderLayout.SOUTH);
JPanel jpnlCenterPanel = new JPanel(new GridLayout(1, 2));
this.jfrmMain.add(jpnlCenterPanel, BorderLayout.CENTER);
3 设计学生信息录入画板
/**
* 中央主画板左边作为 学生信息录入画板
*/
JPanel jpnlStuInfo = new JPanel(null);
jpnlCenterPanel.add(jpnlStuInfo);
/**
* 定位需要的几个参考变量
*/
int top = DefaultFontSize;
int lbWidth = 4 * DefaultFontSize;
int lbHeight = DefaultFontSize;
(1) 姓名标签,姓名文本框绘制
/**
* jpnlStuInfo
* 学生姓名标签和文本框绘制
*/
JLabel jlblName = new JLabel("姓 名");
jlblName.setFont(DefaultFont);
jlblName.setBounds(
0, top,
lbWidth,
lbHeight);
jpnlStuInfo.add(jlblName);
this.jtxtName = new JTextField(TEXTLENGTH);
this.jtxtName.setFont(DefaultFont);
this.jtxtName.setBounds(
lbWidth, top,
TEXTLENGTH * DefaultFontSize,
DefaultFontSize);
jpnlStuInfo.add(this.jtxtName);
(2) 口令标签,口令密码框绘制
/**
* jpnlStuInfo
* 学生口令标签及密码框绘制
*/
top += this.jtxtName.getHeight() + MARGIN;
JLabel jlblPassWord = new JLabel("口 令");
jlblPassWord.setFont(DefaultFont);
jlblPassWord.setBounds(
0, top,
lbWidth,
lbHeight);
jpnlStuInfo.add(jlblPassWord);
this.jpsdPassWord = new JPasswordField(TEXTLENGTH);
this.jpsdPassWord.setFont(DefaultFont);
this.jpsdPassWord.setBounds(
lbWidth, top,
TEXTLENGTH * DefaultFontSize,
DefaultFontSize);
jpnlStuInfo.add(this.jpsdPassWord);
(3) 性别标签,单选按钮绘制
/**
* jpnlStuInfo
* 学生性别标签和男,女单选按钮绘制
*/
top += this.jpsdPassWord.getHeight() + MARGIN;
JLabel jlblSex = new JLabel("性 别");
jlblSex.setFont(DefaultFont);
jlblSex.setBounds(
0, top,
lbWidth,
lbHeight);
jpnlStuInfo.add(jlblSex);
this.jrbtMan = new JRadioButton("男");
this.jrbtMan.setFont(DefaultFont);
this.jrbtMan.setBounds(
lbWidth, top,
TEXTLENGTH * DefaultFontSize / 2,
DefaultFontSize);
jpnlStuInfo.add(this.jrbtMan);
this.jrbtWoman = new JRadioButton("女");
this.jrbtWoman.setFont(DefaultFont);
this.jrbtWoman.setBounds(
lbWidth +this.jrbtMan.getWidth() + MARGIN, top,
TEXTLENGTH * DefaultFontSize / 2,
DefaultFontSize);
jpnlStuInfo.add(this.jrbtWoman);
//将单选按钮加入同一组中才会只能选中一个
ButtonGroup btgpSex = new ButtonGroup();
btgpSex.add(jrbtMan);
btgpSex.add(jrbtWoman);
(4) 生日日期标签,年月日下拉列表绘制
/**
* jpnlStuInfo
* 学生出生日期绘制及年,月,日下拉列表绘制
*/
top += this.jrbtWoman.getHeight() + MARGIN;
int birthLeft = 0;
birthLeft = lbWidth + MARGIN;
JLabel jlblBirth = new JLabel("出生日期");
jlblBirth.setFont(DefaultFont);
jlblBirth.setBounds(
0, top,
lbWidth,
lbHeight);
jpnlStuInfo.add(jlblBirth);
this.jcmbYear = new JComboBox<>();
this.jcmbYear.setFont(DefaultFont);
this.jcmbYear.setBounds(
birthLeft, top,
DefaultFontSize * 3,
DefaultFontSize + 3);
jpnlStuInfo.add(this.jcmbYear);
birthLeft += this.jcmbYear.getWidth();
JLabel jlblYear = new JLabel("年");
jlblYear.setFont(DefaultFont);
jlblYear.setBounds(
birthLeft, top,
lbWidth,
lbHeight);
jpnlStuInfo.add(jlblYear);
birthLeft += 20;
this.jcmbMonth = new JComboBox<>();
this.jcmbMonth.setFont(DefaultFont);
this.jcmbMonth.setBounds(
birthLeft , top,
DefaultFontSize * 3,
DefaultFontSize + 3);
jpnlStuInfo.add(this.jcmbMonth);
birthLeft += this.jcmbMonth.getWidth();
JLabel jlblMonth = new JLabel("月");
jlblMonth.setFont(DefaultFont);
jlblMonth.setBounds(
birthLeft, top,
lbWidth,
lbHeight);
jpnlStuInfo.add(jlblMonth);
birthLeft += 20;
this.jcmbDate = new JComboBox<>();
this.jcmbDate.setFont(DefaultFont);
this.jcmbDate.setBounds(
birthLeft, top,
DefaultFontSize * 3,
DefaultFontSize + 3);
jpnlStuInfo.add(this.jcmbDate);
birthLeft += this.jcmbDate.getWidth();
JLabel jlblDate = new JLabel("日");
jlblDate.setFont(DefaultFont);
jlblDate.setBounds(
birthLeft, top,
lbWidth,
lbHeight);
jpnlStuInfo.add(jlblDate);
(5) 爱好复选框绘制,命令按钮绘制
/**
* jpnlStuInfo
* 学生爱好复选框绘制
*/
top += this.jcmbDate.getHeight() + MARGIN;
this.jpnlHobbyOutter = new JPanel(new BorderLayout());
this.jpnlHobbyOutter.setBounds(
0, top,
lbWidth * 4,
lbHeight * 7);
jpnlStuInfo.add(this.jpnlHobbyOutter);
//设置jpnlHobbyOutter标题框
TitledBorder ttbdHobby = new TitledBorder("爱好");
ttbdHobby.setTitleFont(DefaultFont);
ttbdHobby.setTitlePosition(TitledBorder.TOP);
ttbdHobby.setTitleJustification(TitledBorder.CENTER);
this.jpnlHobbyOutter.setBorder(ttbdHobby);
//设置存储爱好的JCheckBox对象的jpnlHobby
//设置其布局为流式布局的左对齐模式
FlowLayout flowHobby = new FlowLayout();
flowHobby.setAlignment(FlowLayout.LEFT);
JPanel jpnlHobby = new JPanel(flowHobby);
this.jpnlHobbyOutter.add(jpnlHobby, BorderLayout.CENTER);
//初始化存储爱好的ArrayList
this.jckbHobbies = new ArrayList<JCheckBox>();
//将爱好数组中的String类元素转为JCheckBox类
//并添加到jpnlHobby中
for(String hobbyName : hobbyContext) {
JCheckBox jckbHobby = new JCheckBox(hobbyName);
jckbHobby.setFont(DefaultFont);
this.jckbHobbies.add(jckbHobby);
jpnlHobby.add(jckbHobby);
}
/**
* jpnlStuInfo
* 对爱好的按钮加入到jpnlHobbyOutter的south
*/
JPanel jpnlHobbyButton = new JPanel(new FlowLayout());
this.jpnlHobbyOutter.add(jpnlHobbyButton, BorderLayout.SOUTH);
this.jbtnHobbyAll = new JButton("全选");
this.jbtnHobbyAll.setFont(DefaultFont);
jpnlHobbyButton.add(this.jbtnHobbyAll);
this.jbtnHobbyRev = new JButton("反选");
this.jbtnHobbyRev.setFont(DefaultFont);
jpnlHobbyButton.add(this.jbtnHobbyRev);
this.jbtnHobbyRst = new JButton("重置");
this.jbtnHobbyRst.setFont(DefaultFont);
jpnlHobbyButton.add(this.jbtnHobbyRst);
top += jpnlHobbyOutter.getHeight();
(6) 简介文本区绘制
/**
* jpnlStuInfo
* 学生简介框绘制
*/
this.jtatIntroduce = new JTextArea();
this.jtatIntroduce.setFont(DefaultFont);
this.jscpIntroduce = new JScrollPane(this.jtatIntroduce);
this.jscpIntroduce.setBounds(
0, top,
lbWidth * 4,
lbHeight * 6 + 3);
//设置标题框
TitledBorder ttbdIntroduce = new TitledBorder("个人简介");
ttbdIntroduce.setTitleFont(DefaultFont);
ttbdIntroduce.setTitlePosition(TitledBorder.TOP);
ttbdIntroduce.setTitleJustification(TitledBorder.CENTER);
this.jscpIntroduce.setBorder(ttbdIntroduce);
jpnlStuInfo.add(this.jscpIntroduce);
4 设置学生列表画板
/**
* 中央窗口右侧画板,作为列表显示信息
*/
JPanel jpnlStuList = new JPanel(new BorderLayout());
jpnlCenterPanel.add(jpnlStuList);
this.dlmStudentList = new DefaultListModel<>();
this.jlstStudentlist = new JList<>(dlmStudentList);
this.jlstStudentlist.setFont(DefaultFont);
this.jscpStuList = new JScrollPane(this.jlstStudentlist);
TitledBorder ttbdStuList = new TitledBorder("学生列表");
ttbdStuList.setTitleFont(DefaultFont);
ttbdStuList.setTitlePosition(TitledBorder.TOP);
ttbdStuList.setTitleJustification(TitledBorder.CENTER);
this.jscpStuList.setBorder(ttbdStuList);
jpnlStuList.add(this.jscpStuList, BorderLayout.CENTER);
this.jlblStuAcoount = new JLabel("共0名学生");
this.jlblStuAcoount.setFont(DefaultFont);
jpnlStuList.add(this.jlblStuAcoount, BorderLayout.SOUTH);
5 控制按钮设置
/**
* jpnlSouthButton
* 功能化按键
*/
this.jbtnAdd = new JButton("添加");
this.jbtnAdd.setFont(DefaultFont);
jpnlSouthButton.add(this.jbtnAdd);
this.jbtnModify = new JButton("更改");
this.jbtnModify.setFont(DefaultFont);
jpnlSouthButton.add(this.jbtnModify);
this.jbtnRemove = new JButton("删除");
this.jbtnRemove.setFont(DefaultFont);
jpnlSouthButton.add(this.jbtnRemove);
this.jbtnExit = new JButton("退出");
this.jbtnExit.setFont(DefaultFont);
jpnlSouthButton.add(this.jbtnExit);
6 日期复选框的reinit()
在用户输入出生日期进行选择时,由于存在平年,闰年的问题,每个月的天数是不一样的,所以年月日的复选框reinit()需要单独处理,提供合理的日期选择
@Override
public void reinit() {
/**
* 年月日初始化
*/
Calendar today = Calendar.getInstance();
int endYear = today.get(Calendar.YEAR);
for(int startYear = 1970; startYear <= endYear; startYear++) {
this.jcmbYear.addItem(startYear);
}
for(int month = 1; month <= 12; month++) {
this.jcmbMonth.addItem(month);
}
setDate();
}
private void setDate() {
Integer year = (Integer)this.jcmbYear.getSelectedItem();
Integer month = (Integer)this.jcmbMonth.getSelectedItem();
if(null == year || null == month) {
return;
}
Calendar date = Calendar.getInstance();
date.set(year, month, 0);
int lastDate = date.get(Calendar.DATE);
this.jcmbDate.removeAllItems();
for(int value = 1; value <= lastDate; value++) {
this.jcmbDate.addItem(value);
}
}
7 窗口接口,测试类
package com.mec.Windows;
import java.awt.Color;
import java.awt.Font;
public interface IWindow {
int width = 800;
int height = 600;
int MARGIN = 6;
int TEXTLENGTH = 8;
Font DefaultFont = new Font("宋体", Font.BOLD, 20);
Color DefaultColor = new Color(144, 32, 32);
int DefaultFontSize = DefaultFont.getSize() + 4;
Font topicFont = new Font("微软雅黑", Font.ITALIC, 24);
Color topicColor = new Color(32, 32, 144);
void init();
void reinit();
void showTheView();
}
package com.mec.Windows;
public class Demo {
public static void main(String[] args) {
StudentView w1 = new StudentView();
w1.init();
w1.reinit();
w1.showTheView();
}
}
P2 控件类
1 所使用控件类用法
(1) 主窗口 JFrame类
使用JFrame类完成主窗口的初始化
(2) 标签 JLabel类
使用JLabel完成各种文本标志或作为空标签填充
(3) 字体 Font类 颜色 Color类
使用Font设置字体的形式,标准和大小,使用Color用3原色设置颜色
(4) 画板 JPanel类
使用JPanel设置各种布局的画板,填充到需要的位置,向其中添加控件完成设计
(5) 五方布局 BorderLayout类
new BorderLayout()
使用BorderLayout()布局的画板或主窗口,将界面内的区域分为5部分,即东西南北中
(6) 流式布局 FlowLayout类
new FlowLayout();
使用流式布局的主窗口或画板,当向其中加入控件时,会一个接一个向其中加入,当前行放满了则换行
(7) 文本框 JTextField类
文本框用来输入文本,类实例化时需要给构造器一个存储文本最大长度
(8) 密码框 JPasswordField类
密码框类似于文本框,只是输入时输入的数据默认显示为 * ,且其中的数据不可复制
(9) 单选按钮 JRadioButton类
JRadioButton意为单选按钮,使用时需要给一个按钮名
(10) 按钮组 ButtonGroup类
当添加了JRadioButton后,并没有完成真正的单选,没有将jrbtMan和jrbtWoman加入到同一个按钮组之前,这两个单选按钮并没有联系,可以同时选择
(11) 下拉列表 JComboBox类
使用下拉列表前,需要明确它的泛型类型
(12) 标题框 TitledBorder类
当需要给一个画板取命时,需要先初始化一个TitledBorder类的对象,为它取名并设置字体,及相对于画板的位置和相对位置,最后将所需要标题的画板布局方式更改为TitledBorder的对象
(13) 复选框 JCheckBox类
创建一个流式布局的画板,使用数组和循环完成对JCheckBox对象的赋值并将其加入到画板中
(14) 滚动框 JScrollPane类
需要使用滚动框时,先创建一个需要滚动框作用的控件,再类实例化一个JScrollPane类的对象,在构造器中添加需要滚动作用的控件即可
(15) 文本区 JTextArea类
文本区一般需要滚动功能,所以一般先创建一个文本框,将其加入到滚动画板中
(16) 列表默认内置数据 DefaultListModel类
为了完成可视化的列表,需要DefaultListModel类并在声明时明确泛型,一般它作为JList的参数,作为列表存储元素的类型
设置好列表后,将列表加入到滚动框中,实现滚动功能
(17) 列表 List类
使用List类的ArrayList将爱好复选框存入动态数组中,以便后续的面向事件编程
P3 总结
1 总结
窗口编程要注意细节,尤其是使用绝对定位时,注意总体的布局和每个控件的用法
上面只完成了最基本的界面设计,其中设计好的单选按钮,复选按钮都没有任何的作用,还需要对每一个可能的操作添加侦听器和适配器,完成窗口对用户操作的响应,真正的实现面向事件编程,完成交互式窗口