Devsumi Openjam

Preview:

DESCRIPTION

 

Citation preview

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

2011年2月26日土曜日

Griffon

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

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

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

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

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日土曜日

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日土曜日

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日土曜日

2011年2月26日土曜日

JavaでSwingすると

2011年2月26日土曜日

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

2011年2月26日土曜日

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

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

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

2011年2月26日土曜日

そこで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日土曜日

Groovyだけでも

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

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

2011年2月26日土曜日

2011年2月26日土曜日

Getting Started

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

2011年2月26日土曜日

GriffonのMVC

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

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

バインディング

2011年2月26日土曜日

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

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

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

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

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

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

スレッド

2011年2月26日土曜日

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日土曜日

Groovy

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

2011年2月26日土曜日

プラグイン

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

2011年2月26日土曜日

パッケージング&配布

2011年2月26日土曜日

お好みで

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

2011年2月26日土曜日

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

2011年2月26日土曜日

事例

2011年2月26日土曜日

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

2011年2月26日土曜日

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

2011年2月26日土曜日

Recommended