第8章Java实例界面制作ggao1.设计目标•设计一个学生管理系统•功能设计–添加、修改、删除、查看学生信息•学生信息–学号,姓名,电话,寝室,职务,籍贯等–这一部分留在下一章建设•界面设计–主界面,查询界面,修改界面,添加界面,删除界面•界面切换–通过主界面可以切换到任意的其他界面–其他界面可以返回到主界面1.1主界面1.2添加界面1.3修改•暂时放一放这个功能1.4删除1.5查询2项目设计思路•利用Jframe组件创建一个窗口,作为程序的运行窗口•Jframe上放置Jpanel面板组件,作为程序的界面–应该有5个Jpanel,代表5个界面•Jpanel上放置各种其他组件来实现每个界面的功能–Jlabel标签组件用来放提示文字–Jbutton按钮组件用来放按钮–JTextField文本框组件用来放输入数据的文本框–Jtable表格组件用来放显示学生信息的表格3创建项目窗口•1.创建项目–SMS•2.创建包–Wtu•3.创建主Java类–包含Main方法–mc(mainclass)•4.main方法中创建Jframe对象jsw,标题设置为“学生管理系统”,坐标及大小(200,100,800,600)JFramejsw=newJFrame(“学生管理系统”);//生成一个jframe对象jsw.setBounds(200,100,800,600);//设置窗口坐标及大小jsw.setVisible(true);//显示窗口,隐藏:设置参数为false4制作主界面•1.创建主界面Jpanel对象mjp,并将其添加到jsw上JPanelmjp=newJPanel();//创建一个默认布局的面板表示主界面mjp.setLayout(null);//设置mjp不使用布局,以实现其上组件的自定义布局jsw.getContentPane().add(mjp);//添加mjp到jsw上•2.创建一个Jlabel组件对象jml,用来显示“欢迎使用学生管理系统”,并放置在主界面jmp上JLabeljml=newJLabel(“欢迎使用学生管理系统”);//创建jml对象Jl.setBounds(100,100,200,100);//设置jml坐标及大小mjp.add(jml);//把jml添加到mjp(主界面)上面•3.创建4个Jbutton组件对象,用来表示4个功能按钮,设置它们的坐标及大小,并将它们添加到mjp上JButtonjbtQ=newJButton(查询);//创建按钮组件对象jbtQ.setBounds(100,400,80,40);//设置查询按钮坐标及大小JButtonjbtA=newJButton(添加);//创建按钮组件对象jbtA.setBounds(200,400,80,40);JButtonjbtU=newJButton(修改);//创建按钮组件对象jbtU.setBounds(300,400,80,40);JButtonjbtD=newJButton(删除);//创建按钮组件对象jbtD.setBounds(400,400,80,40);jbtQ.add(jml);//把jbtQ(查询按钮对象)添加到mjp(主界面)上jbtA.add(jml);jbtU.add(jml);jbtD.add(jml);注意:观察老师把多条代码摆放的位置,而且要理解为什么是那样?5.Java项目打包•编制好的项目如果想脱离eclipse运行•把项目打包成jar包–Jar(JavaArchive,Java归档文件),它是将许多文件组合成的一个压缩文件–包含main方法的jar包可以直接运行•电脑安装jdk的前提下打包过程•1.右键单击项目,选export•2.在弹出的界面选Java-JARfile,然后点击next•3.在弹出界面给定jar包位置及文件名,然后点击next•4.在弹出的JARpackagingOptions面板,不用修改配置,直接点击next•5.在弹出的面板,选择包含Main方法的类,然后点击finish完成导出运行Jar包•1.鼠标直接单击可运行•2.命令行运行–java–jartest.jar课堂练习1•实现如下的界面,并把项目打包,并创建快捷方式,通过点击快捷方式直接运行程序6制作其他界面的思路•可行的方法:在包含jsw的main方法中,比如要制作添加界面,再创建一个jpanel面板表示添加界面,创建文本框组件和按钮组件,并放置在其上,已完成该面板的界面设计。最后,通过把该面板添加到jsw对象上,来显示该面板•缺点:程序不好维护;蜕化成结构化设计•选择的方法:创建一个jpanel子类,界面及功能在该子类中完成7设计JPanel子类•该类是4个其他界面的抽象,通过该类可以创建4个不同的Jpanel对象•该类的界面目标–在包含jsw对象的main方法中使用该类创建对象时,对象就具有了完整的界面定义,而无需再设置•Ojpanel(otherjpanel)–父类为Jpanel–实现父类的JPanel()构造方法•1.创建OJpanel类,要选择构造函数一项,main方法不用选•2.修改Ojpanel代码,让其继承JPanel类•3.修改构造函数,让其执行父类的构造函数JPanel()–子类必须实现父类的一个构造函数8在OJpanel中设计界面•因为Ojpanel可以生成4中不同的界面,可以用4个方法来为不同的界面设计放在其上的组件•initQ()表示为添加界面设计组件的方法–该方法中要添加6个标签,6个文本框,2个按钮–并将它们添加到Jpanel上•此时的jpanel就是ojpanel(它具有jpanel的一切功能)•类中要使用自己,用this•1.修改Ojpanel构造函数–增加一个参数ptype,如果ptype为1则执行添加界面的设计方法initQ()•并在构造方法中设置当前类布局为无–this.setLayout(null);•2.设计方法initQ()–创建Jlabel,JtextFiled,Jbutton组件对象–添加到当前面板•比如添加标签对象jl,则为:this.add(jl),表示把jl对象添加到由当前类产生的对象上,而当前类是一个从Jpanel对象派生的类,也就是把jl添加到一个jpanel面板对象上•intlx=100;•intlxoffset=300;•intly=100;•intlyoffset=100;•intlw=40;•intlh=50;•JLabeljlxh=newJLabel(学号);•jlxh.setBounds(lx,ly,lw,lh);•JLabeljlxm=newJLabel(姓名);•jlxm.setBounds(lx+lxoffset,ly,lw,lh);•JLabeljldh=newJLabel(电话);•jldh.setBounds(lx,ly+lyoffset,lw,lh);•JLabeljlqs=newJLabel(寝室);•jlqs.setBounds(lx+lxoffset,ly+lyoffset,lw,lh);•JLabeljlzw=newJLabel(职务);•jlzw.setBounds(lx,ly+lyoffset*2,lw,lh);•JLabeljljg=newJLabel(籍贯);•jljg.setBounds(lx+lxoffset,ly+lyoffset*2,lw,lh);•inttx=200;•inttxoffset=300;•intty=115;•inttyoffset=100;•inttw=120;•intth=30;•inttlength=20;•JTextFieldjtfxh=newJTextField(tlength);•jtfxh.setBounds(tx,ty,tw,th);•JTextFieldjtfxm=newJTextField(tlength);•jtfxm.setBounds(tx+txoffset,ty,tw,th);•JTextFieldjtfdh=newJTextField(tlength);•jtfdh.setBounds(tx,ty+tyoffset,tw,th);•JTextFieldjtfqs=newJTextField(tlength);•jtfqs.setBounds(tx+txoffset,ty+tyoffset,tw,th);•JTextFieldjtfzw=newJTextField(tlength);•jtfzw.setBounds(tx,ty+tyoffset*2,tw,th);•JTextFieldjtfjg=newJTextField(tlength);•jtfjg.setBounds(tx+txoffset,ty+tyoffset*2,tw,th);•JButtonjbtA=newJButton(添加);//创建按钮组件对象•jbtA.setBounds(200,400,80,40);•JButtonjbtB=newJButton(返回);//创建按钮组件对象•jbtB.setBounds(300,400,80,40);•this.add(jlxh);•this.add(jlxm);•this.add(jldh);•this.add(jlqs);•this.add(jlzw);•this.add(jljg);•this.add(jtfxh);•this.add(jtfxm);•this.add(jtfdh);•this.add(jtfqs);•this.add(jtfzw);•this.add(jtfjg);•this.add(jbtA);•this.add(jbtB);•3.在包含jsw的main方法中,创建OJpanel的添加界面对象ajp,并把其添加到jsw上9添加按钮事件•给mjp的添加按钮设置事件,实现切换界面的功能jbtA.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){这里放切换到添加界面的按钮}});•切换方法(隐藏mjp,添加并显示ajp)–mjp.setVisible(false);//把主界面mjp设置为不可见–jsw.getContentPane().add(ajp);//添加ajp到jsw上–ajp.setVisible(true);//显示添加界面ajp•在事件处理函数中,对象要变为final10返回按钮事件•在OJpanel类中给返回按钮,添加事件jbtB.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){隐藏谁?当前面板,可用this代替吗?添加谁?使用jsw的方法添加mjp,但这两个对象从何而来?}});•解答问题–1.可用this代替当前面板吗?•不能,因为事件处理方法在一个类的定义中,这里用this不是代表OJpanel对象,而是事件接口的类所对应的对象•解答:定义一个成员Jpanel对象,在构造函数中把当前类所对应对象(this)赋值给它–2.jsw,mjp从何而来?•在OJpanel中定义两个成员对象表示他们,通过构造函数,在定义ajp对象时给他们赋值作业7•利用第7、8次课所学知识,实现第1节的设计–抽查