JAVA SE 进阶篇 C1 窗口设计

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 总结

窗口编程要注意细节,尤其是使用绝对定位时,注意总体的布局和每个控件的用法

上面只完成了最基本的界面设计,其中设计好的单选按钮,复选按钮都没有任何的作用,还需要对每一个可能的操作添加侦听器和适配器,完成窗口对用户操作的响应,真正的实现面向事件编程,完成交互式窗口

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值