Java swing 界面设计 个人简介(上) - 盛世孤舟
首先附上一份本人的实验设计报告
一、 设计要求
1、目的
要求学生运用Java集成开发工具(Eclipse),独立编写一个应用程序,使学生能够通过实践,将面向对象程序设计的理论、技术、方法和Java语言相结合,熟练使用Java类库进行一些较为复杂实例的应用系统程序设计。
2 、开发环境
1.系统环境:Windows 7系统
1. jdk版本:jdk1.8.0_25
2.集成开发环境:Eclipse
3、设计要求:
创建一个GUI界面,实现以下功能:
- 编程实现界面
- 点击保存“按钮”,简介内容显示在下方的文本区中
- 点击“清空”,简介内容清除
- 点击“退出”,退出页面。
- 选用的组件是什么,怎么布局的要在报告中写清楚。
- 以上是基本的要求,但可以加入自己的一些其他的设计,可以自由发挥。
二、设计思路
创建图形用户界面程序的第一步是创建一个容器类以容纳其他组件,常见的窗口就是一种容器。容器本身也是一种组件,它的作用就是用来组织、管理和显示其他组件。
Swing 中容器可以分为两类:顶层容器和中间容器。
顶层容器是进行图形编程的基础,一切图形化的东西都必须包括在顶层容器中。顶层容器是任何图形界面程序都要涉及的主窗口,是显示并承载组件的容器组件。在 Swing 中有三种可以使用的顶层容器,分别是 JFrame、JDialog 和 JApplet。
JFrame:用于框架窗口的类,此窗口带有边框、标题、关闭和最小化窗口的图标。带 GUI 的应用程序至少使用一个框架窗口。
中间容器是容器组件的一种,也可以承载其他组件,但中间容器不能独立显示,必须依附于其他的顶层容器。常见的中间容器有 JPanel、JScrollPane、JTabbedPane
和 JToolBar。
JPanel:表示一个普通面板,是最灵活、最常用的中间容器。
JScrollPane:与 JPanel 类似,但它可在大的组件或可扩展组件周围提供滚动条。
JTabbedPane:表示选项卡面板,可以包含多个组件,但一次只显示一个组件,用户可在组件之间方便地切换。
JToolBar:表示工具栏,按行或列排列一组组件(通常是按钮)。
初步实现:
能够把基本框架界面,布置出来,然后替换要求中的控件
一个顶层容器,
布局为三行一列,从上到下放置三个中间容器
三个中间容器,
分别是panel_1 (四行一列),
个人简历
姓名 性别
生日 年龄
住址
panel_up(四行一列),
政治面貌 所学课程
所学专业
爱好
毕业院校
panel_bottom(三行一列)
简介
保存时显示的结果 文本域
按钮
9个底层容器,
分别是 panel_2—panel_9()其中采用了主要是流布局,将各个控件加入,调试,使其与要求上的相同
初步实现使用的仅仅是两种控件,文本域。标签,按钮,下一步将逐步替换 将文本框框换成这各种控件
具体的框架已经搭好之后,可以将临时代替位置的文本框换成要求的控件
本实验用到了很多控件,下面介绍,
标签是一种可以包含文本和图片的非交互组件,其文本可以是单行文本,也可以是 HTML 文本。对于只包含文本的标签可以使用 JLabel 类,我使用的主要构造方法有如下几种形式。
JLabel():创建无图像并且标题为空字符串的 JLabel。
JLabel(Icon image):创建具有指定图像的 JLabel。
JLabel(String text):创建具有指定文本的 JLabel。
按钮是图形界面上常见的元素。在 Swing 中按钮是 JButton 类的对象,JButton 类的常用构造方法如下。
JButton():创建一个无标签文本、无图标的按钮。
JButton(Icon icon):创建一个无标签文本、有图标的按钮。
JButton(String text):创建一个有标签文本、无图标的按钮。
JButton(String text,Icon icon):创建一个有标签文本、有图标的按钮。
单行文本框,它允许用户输入单行的文本信息。该类的常用构造方法如下。
JTextField():创建一个默认的文本框。
JTextField(String text):创建一个指定初始化文本信息的文本框。
文本域与文本框的最大区别就是文本域允许用户输入多行文本信息。在 Swing 中使用 JTextArea 类实现一个文本域,其常用构造方法如下。
JTextArea():创建一个默认的文本域。
JTextArea(int rows,int columns):创建一个具有指定行数和列数的文本域。
复选框有选中和未选中两种状态,并且可以同时选定多个复选框。Swing 中使用 JCheckBox 类实现复选框,该类的常用构造方法如下。
JCheckBox():创建一个默认的复选框,在默认情况下既未指定文本,也未指定图像,并且未被选择。
JCheckBox(String text):创建一个指定文本的复选框。
单选按钮与复选框类似都有两种状态,不同的是一组单选按钮中只能有一个处于选中状态。Swing 中 JRadioButton 类实现单选按钮,它与 JCheckBox 一样都是从 JToggleButton 类派生出来的。JRadioButton 通常位于一个 ButtonGroup 按钮组中,不在按钮组中的 JRadioButton 也就失去了单选按钮的意义。
单选按钮,只能有一个单选按钮被选中。因此,如果创建的多个单选按钮其初始状态都是选中状态,则最先加入 ButtonGroup 按钮组的单选按钮的选中状态被保留,其后加入到 ButtonGroup 按钮组中的其他单选按钮的选中状态被取消。
JRadioButton 类的常用构造方法如下。
JRadioButton():创建一个初始化为未选择的单选按钮,其文本未设定。
JRadioButton(Icon icon):创建一个初始化为未选择的单选按钮,其具有指定的图像但无文本。
列表框与下拉列表的区别不仅仅表现在外观上,当激活下拉列表时,会出现下拉列表框中的内容。但列表框只是在窗体系上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放到滚动面板中。当用户选择列表框中的某一项时,按住 Shift 键并选择列表框中的其他项目,可以连续选择两个选项之间的所有项目,也可以按住 Ctrl 键选择多个目。
Swing 中使用 JList 类来表示列表框,该类的常用构造方法如下。
JList():构造一个空的只读模型的列表框。
JList(ListModel dataModel):根据指定的非 null 模型对象构造一个显示元素的列表框。
以下是功能具体实现时使用的控件
姓名:
简单的文本框,取出文本框中的内容使用.getText()方法 ,使用append方法添加到文本域中的后边
性别:
单选按钮,JRadioButton实例化之后,加入一个ButtonGroup组中,添加到底层容器中,之后和姓名文本框一起加到一个流布局的容器中,实现这两个控件在一行上,然后使用.isSelected() 方法进行判断有没有选择,判断选择后使用一个标志字符串记录,在显示结果的文本域中完成显示。
年月日:
在同一个流布局底层容器中,显示在同一行,使用下拉列表,用列表存下下拉列表因该有的选项,在实例化的时候将列表的选项传入,在(String)cb1.getSelectedItem,的方法将选择的选项存下来,在最终结果中显示出来
年龄住址:
使用和姓名一样的、方法3
爱好:
使用复选框,这种框框和单选框的区别是他可以多选几个,JCheckBox biao = new
JCheckBox(“表演”); 然后这样的方法lan.isSelected()看出有没有进行选择
政治面貌
与年月实现相同
选择课程:
使用的列表框控件 (String)course.getSelectedValue()的方法获得选择的值
所学专业 毕业院校 简介都是文本框操作
三、 实现代码和运行结果
1、实现过程和代码
package xx;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.omg.CORBA.Request;
public class test {
public
static void main(String[] args) {
//总的面板,顶层容器,名称和位置
JFrame
frame =new JFrame();
frame.setTitle(“xlm个人简历”);
frame.setSize(600,1000);//顶层容器
//两个中间容器,实例化
JPanel
panel_up=new JPanel();
JPanel
panel_bottom=new JPanel();
//一大堆的中间容器
JPanel
panel_1=new JPanel();
JPanel
panel_2=new JPanel();
JPanel
panel_3=new JPanel();
JPanel
panel_4=new JPanel();
JPanel
panel_5=new JPanel();
JPanel
panel_6=new JPanel();
JPanel
panel_7=new JPanel();
JPanel
panel_8=new JPanel();
JPanel
panel_9=new JPanel();
JPanel
panel_10=new JPanel();
JPanel
panel_jieguo=new JPanel();
frame.setLayout(new
GridLayout(3,1));//整体的三行一列
frame.add(panel_1);
frame.add(panel_up);
frame.add(panel_bottom);
panel_bottom.setLayout(new
GridLayout(3,1));
/*直接用GridLayout会以所有控件中最宽的空间宽为宽,
最高的控件高为高,输入框会被撑开*/
panel_up.setLayout(new
GridLayout(4,1));//上面的中间容器的设置,要四行一列
//简历字样
JLabel
lbl_jianli =new JLabel(”
个人简历”);
lbl_jianli.setFont(new
Font(“宋体”,Font.BOLD,25));//调节字体大小
JLabel
lbl_username =new JLabel(“姓名”);
JTextField
jtt_name =new JTextField(10);
JLabel
lbl_userage =new JLabel(“性别”);
//单选性别按钮
ButtonGroup
bg=new ButtonGroup();
JRadioButton male = new JRadioButton(“男”, true);
JRadioButton female = new JRadioButton(“女”);
bg.add(male);
bg.add(female);
JLabel
lbl_shengri =new JLabel(“生日:”);
JLabel
lbl_shengri1 =new JLabel(“年 “);
JLabel
lbl_shengri2 =new JLabel(“月 “);
JLabel
lbl_shengri3 =new JLabel(“日 “);
//生日使用下拉列表
String
nian[] = {“1997″,”1998″,”1999″,”2000″,”2001″,”2002”};
JComboBox
cb1 = new JComboBox(nian);
String
yue[] = {“1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”10″,”11″,”12”};
JComboBox
cb2 = new JComboBox(yue);
String
ri[] =
{“1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”10”,
“11”,”12″,”13″,”14″,”15″,”16″,”17″,”18″,”19″,”20″,
“21”,”22″,”23″,”24″,”25″,”26″,”27″,”28″,”29″,”30″,”31″};
JComboBox
cb3 = new JComboBox(ri);
JLabel
lbl_nianling =new JLabel(“年龄”);
JTextField
jtt_nianling =new JTextField(10);
JLabel
lbl_zhuzhi =new JLabel(“住址”);
JTextField
jtt_zhuzhi =new JTextField(20);
//政治面貌下拉列别
JLabel
lbl_zhengzhi =new JLabel(“政治面貌”);
String
zheng[] = {“共青团员”,”党员”};
JComboBox
cb_zheng = new JComboBox(zheng);
//JTextField
jtt_zhengzhi =new JTextField(10);
//所学课程列表框
JLabel
lbl_kecheng =new JLabel(“所学课程”);
String[]
coursesNames = {“Java程序设计”,”数据结构”};
JList
course = new JList(coursesNames);
JLabel
lbl_zhuanye =new JLabel(“所学专业”);
JTextField
jtt_zhuanye =new JTextField(20);
JLabel
lbl_aihao =new JLabel(“爱好:”);
//爱好使用复选框
JCheckBox
chang = new JCheckBox(“唱歌”);
JCheckBox
tiao = new JCheckBox(“跳舞”);
JCheckBox
ping = new JCheckBox(“乒乓球”);
JCheckBox
lan = new JCheckBox(“篮球”);
JCheckBox
zu = new JCheckBox(“足球”);
JCheckBox
yueqi = new JCheckBox(“乐器”);
JCheckBox
biao = new JCheckBox(“表演”);
JCheckBox[]
aihaofu={chang,tiao,ping,lan,zu,yueqi,biao};
//JTextField
jtt_aihao =new JTextField(10);
JLabel
lbl_yuanxiao =new JLabel(“毕业院校”);
JTextField
jtt_yuanxiao =new JTextField(20);
JLabel
lbl_jianjie =new JLabel(“简介”);
JTextField
jtt_jianjie =new JTextField(50);
JTextArea
txt_jianjie =new JTextArea(8,35);///创建文本区对象,要确定文本区的大小
JButton
btn_baocun=new JButton(“保存”);
JButton
btn_tuichu=new JButton(“退出”);
JButton
btn_qingkong=new JButton(“清空”);
panel_1.setLayout(new
GridLayout(4,1));
panel_1.add(lbl_jianli);
//panel_2
是默认流布局
panel_2.add(lbl_username);
panel_2.add(jtt_name);
panel_2.add(lbl_userage);
//panel_2.add(jtt_age);
panel_2.add(male);
panel_2.add(female);
//panel_2.add(bg);
panel_1.add(panel_2);
//生日年月日实现
panel_3.add(lbl_shengri);
panel_3.add(cb1);
panel_3.add(lbl_shengri1);
panel_3.add(cb2);
panel_3.add(lbl_shengri2);
panel_3.add(cb3);
panel_3.add(lbl_shengri3);
panel_3.add(lbl_nianling);
panel_3.add(jtt_nianling);
panel_1.add(panel_3);
panel_4.setLayout(new
FlowLayout());
panel_4.add(lbl_zhuzhi);
panel_4.add(jtt_zhuzhi);
panel_1.add(panel_4);
panel_5.setLayout(new
FlowLayout());
panel_5.add(lbl_zhengzhi);
panel_5.add(cb_zheng);
panel_5.setLayout(new
FlowLayout());
panel_5.add(lbl_kecheng);
panel_5.add(course);
panel_up.add(panel_5);
panel_6.setLayout(new
FlowLayout());
panel_6.add(lbl_zhuanye);
panel_6.add(jtt_zhuanye);
panel_up.add(panel_6);
panel_7.setLayout(new
FlowLayout());
panel_7.add(lbl_aihao);
for
(int i = 0; i<7;i++)
{
panel_7.add(aihaofu[i]);
}
panel_up.add(panel_7);
panel_8.setLayout(new
FlowLayout());
panel_8.add(lbl_yuanxiao);
panel_8.add(jtt_yuanxiao);
panel_up.add(panel_8);
panel_9.setLayout(new
FlowLayout());
panel_9.add(lbl_jianjie);
panel_9.add(jtt_jianjie);
panel_bottom.add(panel_9);
panel_jieguo.add(txt_jianjie);
panel_bottom.add(panel_jieguo);
panel_10.setLayout(new
FlowLayout());
panel_10.add(btn_baocun);
panel_10.add(btn_tuichu);
panel_10.add(btn_qingkong);
panel_bottom.add(panel_10);
//监听按钮事件
class
jianti implements ActionListener{//创建监听类
public
void actionPerformed(ActionEvent e) {
//获取事件源
String
sex = null;
Object
source=e.getSource();
//判断事件源,进行相应的处理
if(source==btn_baocun)//返回主界面
{
//panel_1.setBackground(Color.red);
//单选按钮判定,获取性别
if
(male.isSelected())
{
sex
= “男”;
}
else
{
sex
= “女”;
}
//获取年月日
String
c1,c2,c3;
c1=(String)cb1.getSelectedItem();
c2=(String)cb2.getSelectedItem();
c3=(String)cb3.getSelectedItem();
//复选框,获取爱好
String aihao = “爱好:”;
if(chang.isSelected())
{
aihao
+= “唱歌”;
}
if(tiao.isSelected())
{
aihao
= aihao + “跳舞”;
}
if(ping.isSelected())
{
aihao
= aihao + “乒乓球”;
}
if(lan.isSelected())
{
aihao
= aihao + “篮球”;
}
if(zu.isSelected())
{
aihao
= aihao + “足球”;
}
if(yueqi.isSelected())
{
aihao
= aihao + “乐器”;
}
if(biao.isSelected())
{
aihao
= aihao + “表演”;
}
//政治面貌
String
mianmao;
mianmao=(String)cb_zheng.getSelectedItem();
txt_jianjie.append(“姓名:”+jtt_name.getText()+” “);//直接加到后面
txt_jianjie.append(“性别:”+sex+” “);//直接加到后面
txt_jianjie.append(“生日:”+c1+”年”+c2+”月”+c3+”日 “);//直接加到后面
txt_jianjie.append(“年龄:”+jtt_nianling.getText()+”
\n”);//直接加到后面
txt_jianjie.append(“住址:”+jtt_zhuzhi.getText()+” “);//直接加到后面
txt_jianjie.append(“政治面貌:”+mianmao+” \n”);//直接加到后面
txt_jianjie.append(“所学课程:”+(String)course.getSelectedValue()+” “);//直接加到后面
txt_jianjie.append(“所学专业:”+jtt_zhuanye.getText()+”
\n”);//直接加到后面
//爱好
txt_jianjie.append(aihao+” \n”);//直接加到后面
txt_jianjie.append(“毕业院校:”+jtt_yuanxiao.getText()+” \n”);//直接加到后面
txt_jianjie.append(“简介”+jtt_jianjie.getText()+” “);//直接加到后面
}
else
if(source==btn_qingkong)//清空
{
txt_jianjie.setText(“”);
}
else
if(source == btn_tuichu)//用户
{
frame.setVisible(false);//显示
}
}
}
//按键监听
jianti
tt = new jianti();
btn_baocun.addActionListener(tt);//建立监听对象,主界面
btn_qingkong.addActionListener(tt);//退出
btn_tuichu.addActionListener(tt);
frame.setVisible(true);//显示
}
}
2、运行结果(截图和文字叙述)
不知道为什么 我的图片上传不了
四、问题解决与总结
1、遇到的问题与解决方法
遇到的最多的问题就是控件的选择,和控件的选择信息的获取,在查询api之后并没有得到想要的结果,解决方案是在查阅了csdn等网站之后,找到了一系列的历程,将历程使用到我的程序当中来,在对程序进行调试更改,得到能够符合我们程序功能的源代码
2、设计总结
在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小。如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加。这样虽然能够灵活控制组件的位置,实现却非常麻烦。
为了加快速度,在实验中我使用了一些布局管理器,它们可以将组件进行统一管理,这样就不需要考虑组件是否会重叠等问题。
五、参考文献
Java语言程序设计面向对象设计思想及实践第二版吴倩编著
作业部分到这里就没有了
———————————————————————————这叫分割线
然后呢 我最想通过本文章想给大家传达的是这个
在找一些用法的时候,我是很想去查一查api啦,但是,奈何不懂那些类之间的一些上下继承的关系,于是
于是我决定咨询百度,
但是度哥似乎不知道我真正想要的是什么,
我真正想要的是知道每一个类是怎么建立的一个对象,怎么把这个对象选择了什么取出来,例如文本框中我输入了我的名字tom
那么我只需要知道我怎么建立一个文本框,怎么把我输入的文本框的内容读出来,然后在输出到i别的地方,这就是我想要的,
那么
下面就是纯纯的干货 看完下面这些 你就可以自己写好这个界面了
为了方便,本文分上下两篇
、、、、、剩下的请看下篇