27
日本Grails/Groovyユーザーグループ 奥清隆 @kiy0taka 2011226日土曜日

Devsumi Openjam

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Devsumi Openjam

日本Grails/Groovyユーザーグループ奥清隆 @kiy0taka

2011年2月26日土曜日

Page 2: Devsumi Openjam

Griffon

•Groovyのためのデスクトップアプリケーションフレームワーク

•Swingアプリケーションをより簡単に、そして強力に

•DI、MVC、CoC、コマンドライン

•プラグインでJava資産を有効活用2011年2月26日土曜日

Page 3: Devsumi Openjam

Swing(Java)package sample;

import java.awt.Container;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;

import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextArea;import javax.swing.SwingUtilities;

public class Hello extends JFrame {

public Hello() { super("Hello");

Container contentPane = getContentPane(); contentPane.setLayout(new GridLayout(3, 1));

JLabel label = new JLabel("Label"); contentPane.add(label);

JTextArea textArea = new JTextArea("Text Area"); textArea.setColumns(20); textArea.setRows(2); contentPane.add(textArea);

JButton button = new JButton("Button"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { } });

contentPane.add(button);

setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); }

public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new Hello(); } }); }}

2011年2月26日土曜日

Page 4: Devsumi Openjam

Groovy

import groovy.swing.SwingBuilder

new SwingBuilder().edt { frame(title:'Hello', show:true, pack:true) { gridLayout(cols:1, rows:3) label 'Label' textArea('Text Area', rows:2, columns:20) button('Button', actionPerformed:{ evt -> ... }) }}

2011年2月26日土曜日

Page 5: Devsumi Openjam

import groovy.swing.SwingBuilder

new SwingBuilder().edt { frame(title:'Login', show:true, pack:true) { tableLayout { tr { td { label 'User Name' } td { textField(columns:20) } } tr { td { label 'Password' } td { passwordField(columns:20) } } tr { td(colspan:2, align:'right') { button 'Submit' } } } }}

こんなのとか

2011年2月26日土曜日

Page 6: Devsumi Openjam

2011年2月26日土曜日

Page 7: Devsumi Openjam

JavaでSwingすると

2011年2月26日土曜日

Page 8: Devsumi Openjam

戻り値/引数がObject型•TableModel#getValueAt(int, int)•TreeModel#getChild(Object parent, int)•ListModel#getElementAt(int)•XxxEvent#getSource()•その他いろんなところで型が分からないなら静的である必要はない

2011年2月26日土曜日

Page 9: Devsumi Openjam

匿名クラスの多用button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ... }});

SwingUtilities.invokeLater(new Runnable() { public void run() { ... }});

クロージャとか使えたらもっと読みやすいのに

2011年2月26日土曜日

Page 10: Devsumi Openjam

そこでGroovyですよimport groovy.swing.SwingBuilder

new SwingBuilder().edt { frame(title:'Hello', show:true, pack:true) { gridLayout(cols:1, rows:3) label 'Label' textArea('Text Area', rows:2, columns:20) button('Button', actionPerformed:{ evt -> ... }) }}

2011年2月26日土曜日

Page 11: Devsumi Openjam

Groovyだけでも

•SwingBuilderでデスクトップアプリケーションは簡単に作れる

•しかし、複雑なものを作ったりするにはすこし不足

2011年2月26日土曜日

Page 12: Devsumi Openjam

2011年2月26日土曜日

Page 13: Devsumi Openjam

Getting Started

$ griffon create-app myapp$ cd myapp$ griffon run-app

2011年2月26日土曜日

Page 14: Devsumi Openjam

GriffonのMVC

•Model -> POGO•View -> SwingBuilder•Controller -> Groovy

MVCをきちんと分けて実装できる2011年2月26日土曜日

Page 15: Devsumi Openjam

バインディング

2011年2月26日土曜日

Page 16: Devsumi Openjam

ModelからViewへ// Modelimport groovy.beans.Bindableclass SampleModel { @Bindable String text}

// Viewapplication(...) { textField(text:bind(source:model, ’text’))}

Modelが変更されるとすぐにViewに反映される2011年2月26日土曜日

Page 17: Devsumi Openjam

ViewからModelへ// Modelimport groovy.beans.Bindableclass SampleModel { @Bindable String text}

// Viewapplication(...) { textField(text:bind(target:model, ’text’))}

Viewが変更されるとすぐにModelに反映される2011年2月26日土曜日

Page 18: Devsumi Openjam

スレッド

2011年2月26日土曜日

Page 19: Devsumi Openjam

Javapublic void actionPerformed(ActionEvent evt) { new Thread() { public void run() { heavyTask(); try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { textArea.append("Complete!\n"); } }); } catch (InterruptedException e) { ... } catch (InvocationTargetException e) { ... } } }.start();}

2011年2月26日土曜日

Page 20: Devsumi Openjam

Groovy

// Controllerdef heavyAction = { evt -> doOutside { heavyTask() edt { textArea.append 'Complete!\n' } }}

2011年2月26日土曜日

Page 21: Devsumi Openjam

プラグイン

•様々な機能をプラグインで提供•CSS、JavaFX、Test、Look&Feel...•100以上のプラグインを利用可能•プラグインのインストールもコマンド一発•griffon install <プラグイン名>

2011年2月26日土曜日

Page 22: Devsumi Openjam

パッケージング&配布

2011年2月26日土曜日

Page 23: Devsumi Openjam

お好みで

•「griffon prod package」•Jar、Zip、Applet、Web Start で配布可能•Installerプラグインでさらに色んな形式で•.exe、.app、IzPack、RPM、DEB、DMG

2011年2月26日土曜日

Page 24: Devsumi Openjam

より詳しく•Griffon•http://griffon.codehaus.org/•サンプルコード•${GRIFFON_HOME}/samples•G*Magazineで連載中「Griffon不定期便」•http://grails.jp/g_mag_jp/

2011年2月26日土曜日

Page 25: Devsumi Openjam

事例

2011年2月26日土曜日

Page 26: Devsumi Openjam

http://www.jroller.com/aalmiray/entry/so_who_uses_griffon_afterall

2011年2月26日土曜日

Page 27: Devsumi Openjam

ご清聴ありがとうございました

2011年2月26日土曜日