GroovyでSwing
なんというイカしたタイトル!!
...てなことはどうでもいい。
各所をあたって,どうにか「ドラッグ&ドロップしたら,そのファイルをリストアップするJList」を作ったよ。
参考リンク先は以下の通り。
- http://terai.xrea.jp/Swing/FileListFlavor.html
- Swingでドラッグ&ドロップするサンプル
- 1GBレンタルサーバー・プロバイダー Amusement BiG-NET | www5.big.or.jp/~tera/Labo/Java2/j2dnd.html
- Swingでドラッグ&ドロップするサンプル
- O'Reilly Media - Technology and Business Training
- SwingBuilderの基礎
- O'Reilly Media - Technology and Business Training
- SwingBuilderの応用(widget()の使い方)
- http://groovy.codehaus.org/SwingBuilder+with+custom+widgets+and+observer+pattern
- widget()の使い方その2
- http://groovy.codehaus.org/Categorical+Widget+List
- SwingBuilderで作れるウィジェットの一覧
まだ試せてないが,ListenerやAdapterをGroovyらしく実装する方法はないものか...。
- http://groovy.codehaus.org/Groovy+Alternatives+to+Inner+Classes
- コンポーネント側に"
addXXXListener()
"があれば,こんなテクも使えるみたい(今回試したDropTargetListenerはaddできんかったけど)
- コンポーネント側に"
- http://glenp.net/articles/swing-events-with-groovy-closures
- 面白いけど,いちいちクラス作ってられない。metaClassいじってもできるかな?
ちなみに作ったコードはこんな感じ。
== DnDList.groovy ==
import java.awt.dnd.DnDConstants as DnD import java.awt.datatransfer.DataFlavor as DF import java.awt.dnd.DropTarget import java.awt.dnd.DropTargetListener import java.awt.dnd.DropTargetEvent import java.awt.dnd.DropTargetDropEvent import java.awt.dnd.DropTargetDragEvent import javax.swing.JList import javax.swing.DefaultListModel class DnDList extends JList implements DropTargetListener { private dropTarget DnDList() { dropTarget = new DropTarget(this, DnD.ACTION_COPY_OR_MOVE, this, true) model = new DefaultListModel() } void drop(DropTargetDropEvent e) { e.acceptDrop(DnD.ACTION_COPY_OR_MOVE) model.removeAllElements() try { if (e.isDataFlavorSupported(DF.javaFileListFlavor)) { def trans = e.transferable trans.getTransferData(DF.javaFileListFlavor).each { model.addElement(it) } } } catch (ex) { ex.printStackTrace() e.dropComplete(false) } } void dragEnter(DropTargetDragEvent e) { e.acceptDrag(DnD.ACTION_COPY_OR_MOVE) } void dragOver(DropTargetDragEvent dtde) { } void dropActionChanged(DropTargetDragEvent dtde) { } void dragExit(DropTargetEvent dte) { } }
== GuiTest.groovy ==
import groovy.swing.SwingBuilder import javax.swing.WindowConstants as WC import gui.DnDList class GuiTest { GuiTest() { def swing = new SwingBuilder() def frame = swing.frame(title: 'Drag&Drop Test', defaultCloseOperation: WC.EXIT_ON_CLOSE) { scrollPane() { widget(new DnDList()) } } frame.pack() frame.show() } static void main(String[] args) { def gui = new GuiTest() } }