java界面编程---练习1

来源:互联网 发布:害羞知乎 编辑:程序博客网 时间:2024/05/22 07:46
本次实验的目的是编写一个简单的桌面程序:日程管理程序。最终的界面如下:

使用Java做简单的程序界面开发
                      图1 日程显示面板

使用Java做简单的程序界面开发
                        图2 日程添加面板

使用Java做简单的程序界面开发
                 图3 重复设置对话框

具体的功能就不一一解释了,从图上看还是挺直观的。。。


一、首先说一下使用的编程工具。
之前使用的eclipse不支持图形设计工具,于是尝试使用了netbeans。还是挺好用的,但是有一个很致命的缺点就是生成的源代码太过复杂,而且不能直接编辑。。。于是使用了最新版的eclipse,提供了图形设计工具,可以在IDE通过鼠标拖动等操作来设计界面,虽然相比较netbeans操作不太方便,但是习惯就好了。。。而且生成的代码非常简单清晰,利于直接编辑。下面是下载地址:
http://www.eclipse.org/downloads/


二、具体的图形界面设计过程就不说了,体力活。。。下面说几点设计过程中需要注意的地方:
1. 在IDE中添加的各种控件在源代码中各自都对应了一个相应的变量。由于界面的生成是在类的构造函数中进行的,默认的操作是在构造函数中声明并创建控件变量。这样做的话会使得在该类的其他方法中无法调用这些变量。因此正确的做法是在类中(构造函数外)声明这些变量(一般设置其属性为private),然后在构造函数中创建。

2. 图3中的对话框是在图2中选中“重复设置”这一checkBox,然后点击“设置”按钮而产生的。
实现过程中,需要在工程中添加一个新类,该类继承了JDialog,其显示如图3中所示。然后在添加“设置”按钮的监听函数,使得按钮按下后,调用对话框类的main函数(因为main函数中包含了创建对话框的操作)。这样点击按钮后就会出现对话框了。
我们将原窗口称为父窗口,弹出的对话框称为子窗口。
父窗口和子窗口的数据传递:为了实现父窗口和子窗口的数据传递,需要在调用子窗口的main函数时向其中传递参数。main函数的原型,参数为String[] args。这个参数不是绝对的,是可以被修改的,因此我们只要将参数改为我们需要的数据类型即可。从而实现父子窗口之间的数据传递。
子窗口工作时disable掉父窗口:为了保证只有一个子窗口工作,且子窗口工作时父窗口中的设置不被改变,需要在子窗口弹出后disable掉父窗口使其无法被访问。实现方法是在子窗口的构造函数的开头加上一句:
setModal(true);
该函数的功能是使得对话框打开时屏蔽其他窗口。


、由于本例是日程设置,因此免不了对日期和时间的操作。Java以前用来管理时间的类是Date,不过现在已经弃用了,现在使用的类是Calendar
关于Calendar类,下面这个网站有详细的介绍:http://blog.csdn.net/zerogotosum/article/details/1671314

下面说几个我在编程中用到的功能。
创建Calendar类:Calendar date = Calendar.getInstance();
注:此时date中的数据已经被初始化,是当前的日期和时间。因此该语句可以用于获取当前日期和时间。
获取日期和时间:date.get(int field); field可能的取值有Calendar.YEAR,Calendar.MONTH等
设置日期和时间:date.set(int year, int month, int day, int hour, int minute, int second);
比较时间先后:date.after(Calendar another_date); date.before(Calendar another_date);

注:其实在使用的时候没有在网上查太多资料。eclipse比较好用,在一个对象的后面加上“.”后,会自动跳出该类的字段和方法列表,而且鼠标放到每项上都有详细的解释。而且方法名都很直观,一般都能找到需要的方法。
**************************************************************************************************



**************************************************************************************************
最后再讲一个实现中遇到的bug。
在设置日期的时候,希望日期的选项能够根据年份和月份的变化而变化。比如1月是31天,4月是30天,闰年2月是29天,平年2月是28天。

于是在“年”和“月”对应的comboBox的监听函数中添加一项功能:首先调用“日”对应的comboBox的removeAllItems函数将其中所有项删除,然后根据年份和月份计算该月应该有的天数,然后添加进去。

然后程序运行时出错,错误定位在“日”对应的comboBox监听函数中。该行的功能是将“日”comboBox中的数据赋给当前日程项中的日期。
错误的出现是因为removAllItems的实现中,调用了这样的一个监听函数,因为之前选中项被删除掉了,所以给赋值函数传递的是一个null,因此报错。
解决方法是在“日”对应的comboBox监听函数中增加一个判断:当前选中项是否为空,如果非空则赋值。

控件的初始化都是在类的构造函数中,然后因为工程的要求,可能需要在运行的过程中动态改变控件的状态等等。上面这个例子告诉我们,在修改控件状态时,要注意其对应的监听函数。因为类似remove之类的函数的内部实现我们不清楚,很有可能在不知不觉中调用了监听函数从而导致错误。
**************************************************************************************************



**************************************************************************************************
关于这个小工具的编写写了一大半,剩下的就是提醒功能,以及“程序退出时数据写入硬盘”和“程序打开时从硬盘读取数据”。这个以后再实现吧。。。最近看paper有点累了。。。
0 0