針對自己的小作業複習Groovy,所以把Groovy Sql看看。因為小作業需要ResultSet Metadata,所以第一步搞定資料庫連線之後,第二步就開始搞看看ResultSet Metadata,最後就寫一個簡單的程式用comboBox帶出所有的Basic AssetType然後用table帶出該AssetType的ResultSet Metadata。一切隨性,下了班玩自己喜歡的東西好玩就好。
My HomePage Link
2009年7月20日 星期一
2009年7月14日 星期二
複習Groovy (2) - SwingBuilder - table -- cellRender & closureColumn
Preface
寫FTCS XMLPost tool和看書進度緩慢,這個算是寫FTCS XMLPost tool想用的東西。主要的想法是有一塊用JTable來呈現
該Basic Asset Type table的Metadata,然後我可以用勾選的方式,最後產生XMLPost執行的ini設定檔。^^純粹是初步想法
希望會堅持下去用SwingBuilder做完,而不會做到一半覺得改用Wicket做比較快(雖然對我而言是事實)。
Environment
- Groovy 1.6.3
- Sun JDK 1.6.0_10
最初版本和想法
最初是Groovy in Action裡面有關table的範例,作者使用了propertyColumn展示這個componet的做法和功能。以我這個Swing門
外漢想的到,距離心理想要做的東西,針對table還要玩出下列兩項
- closureColumn
- cellRenderer, cellEditor
測試用的殼
Listing. GroovyTest.java
package script;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class GroovyTest {
public static void main(String[] args) throws ScriptException, FileNotFoundException {
if(args.length != 1) {
System.err.println("Missing Required Parameter");
System.exit(-1);
} // if
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");
engine.eval(new InputStreamReader(ClassLoader.getSystemResourceAsStream(args[0])));
} // main()
} // GroovyTest class
closureColumn property
就只是根據書上的範例多的data加一個欄位,用closureColumn來呈現,特別用selected順便在下一個可以用checkbox來
呈現和設定這欄的資料。
Listing. tabDemo0.groovy
package script
/**
* @author Terry
*
*/
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import javax.swing.JCheckBox
import javax.swing.DefaultCellEditor
import javax.swing.WindowConstants as WC
def data = [
[nick:'MrG', full:'Guillaume Laforge', selected: false],
[nick:'jez', full:'Jeremy Rayner', selected: false],
[nick:'fraz', full:'Franck Rasolo', selected: false],
[nick:'sormuras', full:'Christian Stein', selected: false],
[nick:'blackdrag', full:'Jochen Theodorou', selected: false]
]
swing = new SwingBuilder()
generateAction = swing.action( name: 'Execute', closure: {
for (Map row : data) {
println row
}
})
frame = swing.frame(title: 'SwingBuilder - table 踹踹係',
defaultCloseOperation: WC.EXIT_ON_CLOSE) {
panel(layout: new BorderLayout()) {
scrollPane(constraints: BorderLayout.CENTER) {
table() {
tableModel(list: data) {
propertyColumn(header: 'Nickname', propertyName: 'nick')
propertyColumn(header: 'Full Name', propertyName: 'full')
closureColumn(header: 'Import ?',
read: { row -> return row.selected },
write: { row, newValue ->
row.selected = newValue })
}
}
}
hbox(constraints: BorderLayout.SOUTH) {
button( 'Execute' ) {
action(generateAction)
}
}
}
}
frame.pack()
frame.show()
Figure. 程式執行結果
cellRenderer, cellEditor property
對Groovy還沒有到那種感覺的程度,所以就只能按照對Swing的了解用Java的方法搞。所以寫了
一個TableCellRenderer。所以先看到的是CheckCellRenderer.groovy之後在tabDemo.groovy裡面
cellRenderer property就設定這個自訂TableCellRenderer,至於CellEdtor則使用DetaulCellEditor
餵給他JCheckBox的物件就可以了。
Listing. CheckCellRenderer.groovy
package script
import java.awt.Component
import javax.swing.JTable
import javax.swing.JCheckBox
import javax.swing.border.EmptyBorder
import javax.swing.table.TableCellRenderer
class CheckCellRenderer extends JCheckBox implements TableCellRenderer {
CheckCellRenderer() {
super()
setOpaque(true)
setBorderPainted(true)
setBorder(new EmptyBorder(1, 1, 1, 1))
setHorizontalAlignment(JCheckBox.CENTER)
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
setSelected(value)
setForeground(table.getForeground())
setBackground(table.getBackground())
return this
}
}
Listing. tabDemo.groovy
package script
/**
* @author Terry
*
*/
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import javax.swing.JCheckBox
import javax.swing.DefaultCellEditor
import javax.swing.WindowConstants as WC
def data = [
[nick:'MrG', full:'Guillaume Laforge', selected: false],
[nick:'jez', full:'Jeremy Rayner', selected: true],
[nick:'fraz', full:'Franck Rasolo', selected: false],
[nick:'sormuras', full:'Christian Stein', selected: false],
[nick:'blackdrag', full:'Jochen Theodorou', selected: false]
]
swing = new SwingBuilder()
generateAction = swing.action( name: 'Execute', closure: {
for (Map row : data) {
println row
}
})
frame = swing.frame(title: 'SwingBuilder - table 踹踹係',
defaultCloseOperation: WC.EXIT_ON_CLOSE) {
panel(layout: new BorderLayout()) {
scrollPane(constraints: BorderLayout.CENTER) {
table(cellSelectionEnabled: false) {
tableModel(list: data) {
propertyColumn(header: 'Nickname', propertyName: 'nick')
propertyColumn(header: 'Full Name', propertyName: 'full')
closureColumn(header: 'Import ?',
cellRenderer: new CheckCellRenderer(),
cellEditor: new DefaultCellEditor(checkBox(horizontalAlignment: JCheckBox.CENTER)),
read: { row -> return row.selected },
write: { row, newValue ->
row.selected = newValue } )
}
}
}
hbox(constraints: BorderLayout.SOUTH) {
button( 'Execute' ) {
action(generateAction)
}
}
}
}
frame.pack()
frame.show()
Figure. 程式執行結果
Reference
- Groovy Web Site
- Groovy in Action, First Edition
- Swing, Second Edition
Terence Chao, 2009/07/14
2009年7月7日 星期二
複習Groovy的第一章
最近被Manning的Groovy in Action 2Ed預購所吸引...60% off的吸引力太大,就敗了Groovy in Action第二版。因此也把書櫃裡的Groovy in Action第一版拿出來複習一下。自己學東西都是不注重用不用的到,只在乎自己爽不爽,因此學的很發散也忘的很快。哈,記憶體有限很快就purge掉。
因為google要關閉page creator本來打算把用部落格作筆記的做法關掉,一方面也很討厭自己在筆記本唉唉叫的做法,又不是有病幹麻管別人那麼多閒事。為了備份方便,後來改用html搞,沒啥美工天份反正自己看不礙眼就好。網站先放在so-net個人網頁。
- 有點問題的: SyntaxHighlighter - Groovy
- SwingBuilder的練習: SwingBuilder - tabbedPane
訂閱:
文章 (Atom)