SAF
能做什么?
1.
管理窗口的启动和关闭,对整个窗体进行管理。其中继承SingleFrameApplication类就不需要手动设置窗体的位置和大小,程序会自动记住上次打开窗体的位置和大小。如果需要手动设置窗体的屏幕位置或大小,就继承application类即可。
使用
SAF
框架的方案
1
:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/61d0a635894d44c48e2c55d1377be704.png)
使用
SAF
框架的方案
2
:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/c8969a4295bf4d42bf17be6a9a5e8bae.png)
以上2种方案都在屏幕中间显示一个窗体,显示为“Hello World”,但第二种更为简单,第二种方案能记忆住前一次窗口移动的位置和大小,SingleFrameApplication本身也是Application的子类。其中的ExitListener可以处理窗口关闭时的动作。
2.
对资源文件的支持。其中一个类的资源文件(包括图片,文本等)放置位置为该类所在文件夹下的resources下,其中资源文件名格式为:类名.properties.
可以理解为:
一个包下含有一个
resources
文件夹,这个包下的所有
java
文件调用的资源文件都来自这个
resources
文件夹下。
程序怎么和资源文件打交道?
Demo1.java:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/25df37e670d448d98f2bebfcd95843da.png)
resources/Demo1.
properties
demolable.text = this is SAF demo
以上简单的通过例子说明程序如何和资源文件结合。程序最后会显示一个窗体,窗体的内容为“
this is SAF demo”。
从资源文件里初始化类中的变量怎么做呢?
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/a2067b20ca5c4337a5eb16c34a163150.png)
resources/Demo1.
properties
Application.id = Demo1
Demo1.value = 30
以上就是类中变量value,在资源文件中被初始化为30。程序显示结果为窗体中显示
value 30
3.
对
action
的支持。需要给窗体中的按钮增加事件,传统的有2种方式。
传统方式1:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/d87b072a32bf458faf72829197388c5b.png)
传统方式2:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/888255d81016432cb8f177becc7538bb.png)
以上两种方式,通过以下代码增加到按钮上:
JButton jb = new JButton("do");
jb.addActionListener(new MyButtonAction());
那么使用
SAF
框架后,怎么实现按钮的动作?
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/2e03be38397143e19cff486bfcb137b6.png)
以上就定义一个action,和上面2种传统方式的功能都是一样,可以看出这样更简洁。可以通过以下代码增加到按钮上:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/b45c5a26ccaf4a24b2f5bd474a6622d4.png)
可以看出,所有的按钮都可以通过这样的方式来实现action的绑定。使用了元数据的方式(
@action)。
通过这样方式,我们可以把所有的action写在一个包中。当前按钮组件和action不在一个类中时,假设action在AllAction类中,使用:
getContext().getActionMap(AllAction.class, new AllAction())
得到一个
ActionMap
对象,就可以使用了。
或者使用以下方式:
ResourceMap resource = ctxt.getResourceMap(AllAction.class);
resource.injectComponents(this);
ActionMap map = ctxt.getActionMap(this);
4.
对任务
/
线程的支持。通过该框架,可以很方面的实现后台运行action,不会使GUI窗口变成假死现象。
需要说明的是,该框架官方网站提供的标准包在这个类上有点问题,需要使用修正后的包。
一个简单的例子:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/7ef3e14e843544f9871525006ee219d9.png)
以下MyTask.java
![](https://p-blog.csdn.net/images/p_blog_csdn_net/woderchen/74a7f1aaade1458aacc03f32be611f6b.png)
该例子显示为窗体中只有一个按钮,当点击这个按钮,3秒后控制台打印出字符。如果这个action很耗时,这样的任务处理很有效。