Unmi 学习 Groovy 之 Groovy 和 Swing
选择一种动态脚本语言,不仅仅是用它来执行一些控制台或是后台任务,还希望能快速建立 GUI 程序,开发自己的小巧实用的工具。而 Groovy 借助于 GroovyMarkup,并巧妙的结合了 Java 2 与生俱来的 Swing 来创建用户图形界面。当界面程序执行过程中,可直接修改脚本代码来调整显示和功能,无须再编译,比之 Java Swing 程序来的便捷。
其实这还应该是 GroovyMarkup 的内容,本篇也可以叫之 《Unmi 学习 Groovy 之 GroovyMarkup (三)》
Groovy 提供了 SwingBuilder 标记类,它使得创建 Swing 用户界面比 Java 更快,代码更省。当然程序的执行性能在小程序方面已无所谓轻重了。还是以实际例子为见:
上面程序看到 builder.frame 和 builder.optionPane、panel、label 等等就是注册在 SwingBuilder 上的一些 Widget,可以 SwingBuilder 的源码上看到,下面是 SwingBuilder 的代码片断:
毫无疑问,前面的窗口程序改为用标准的 Java 代码来实现会多很多行的代码(会是两倍)。SwingBuilder 类有着映射到标准 Swing 组件的方法,frame() 方法创建了 javax.swing.JFrame,panel() 方法是 javax.swing.JPanel 等等。请联系着 Java 写的 Swing 程序来理解这些方法的 Map 参数和闭包的意义,写过 Swing 程序的朋友看懂它们不会有任何问题。
除了标准的 Swing 组件外,还可以在 groovy.swing.impl 包中找到 TableLayout 组件,我们可以利用它像在网页中画表格那样画 Swing 的表格。
实际我们在 Swing 中应用 JTable 时,会应用 MVC 模式,所以基本要用到 javax.swing.table.TableModel,Groovy 操作 JTable 也不例如。还是看例子:
参考:1. 《Java 脚本编程 语言、框架与模式》 第 5 章,高级的 Groovy 编程 永久链接 https://yanbin.blog/unmi-groovy-swing/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
其实这还应该是 GroovyMarkup 的内容,本篇也可以叫之 《Unmi 学习 Groovy 之 GroovyMarkup (三)》
Groovy 提供了 SwingBuilder 标记类,它使得创建 Swing 用户界面比 Java 更快,代码更省。当然程序的执行性能在小程序方面已无所谓轻重了。还是以实际例子为见:
| 执行该程序的界面如下:
|
上面程序看到 builder.frame 和 builder.optionPane、panel、label 等等就是注册在 SwingBuilder 上的一些 Widget,可以 SwingBuilder 的源码上看到,下面是 SwingBuilder 的代码片断:
1public SwingBuilder() {
2 registerWidgets()
3 headless = GraphicsEnvironment.isHeadless()
4}
5
6protected void registerWidgets() {
7 ..............
8 //
9 // standalone window classes
10 //
11.....................................
12 registerBeanFactory("fileChooser", JFileChooser)
13 registerFactory("frame", new FrameFactory())
14 registerBeanFactory("optionPane", JOptionPane)
15 ........................
16
17 //
18 // widgets
19 //
20 registerFactory("button", new RichActionWidgetFactory(JButton))
21 ..........................
22 registerFactory("label", new TextArgWidgetFactory(JLabel))
23 ..................................
24 registerFactory("textField", new TextArgWidgetFactory(JTextField))
25 ..............................
26 registerBeanFactory("colorChooser", JColorChooser)
27 ..........................
28 registerBeanFactory("panel", JPanel)
29 ...........
30 registerFactory("table", new TableFactory())
31
32 //
33 // Layouts
34 //
35 .....................
36 registerFactory("flowLayout", new LayoutFactory(FlowLayout))
37 ........................
38 registerFactory("springLayout", new LayoutFactory(SpringLayout))
39 ........................
40}毫无疑问,前面的窗口程序改为用标准的 Java 代码来实现会多很多行的代码(会是两倍)。SwingBuilder 类有着映射到标准 Swing 组件的方法,frame() 方法创建了 javax.swing.JFrame,panel() 方法是 javax.swing.JPanel 等等。请联系着 Java 写的 Swing 程序来理解这些方法的 Map 参数和闭包的意义,写过 Swing 程序的朋友看懂它们不会有任何问题。
除了标准的 Swing 组件外,还可以在 groovy.swing.impl 包中找到 TableLayout 组件,我们可以利用它像在网页中画表格那样画 Swing 的表格。
| 执行该程序的界面如下:
、tr、td、等方法可以接受什么命名参数 和闭包。对于做过 Web 应用程序开发的 人员来说,这是一个值得关注的选择。 |
实际我们在 Swing 中应用 JTable 时,会应用 MVC 模式,所以基本要用到 javax.swing.table.TableModel,Groovy 操作 JTable 也不例如。还是看例子:
| 执行该程序的界面如下:
模型通过 tableModel 方法在 table() 闭 包内部定义。模型为每列都定义了 一个closureColumn() 方法,它接受包含 下列数据的 map 参数: header -- 列表题 read -- 填充表的闭包 write -- 结构中更新数据的一个可先闭包。 如果没有定义 write 参数,列被视为只读 ,反之为可编辑,如适于修改单元格数据 即更新数据库中记录。 注意 write 闭包的两个参数:旧数据的 map 和指定的新值。 |
参考:1. 《Java 脚本编程 语言、框架与模式》 第 5 章,高级的 Groovy 编程 永久链接 https://yanbin.blog/unmi-groovy-swing/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。