GroovyでSwing

なんというイカしたタイトル!!
...てなことはどうでもいい。


各所をあたって,どうにか「ドラッグ&ドロップしたら,そのファイルをリストアップするJList」を作ったよ。

参考リンク先は以下の通り。

まだ試せてないが,ListenerやAdapterをGroovyらしく実装する方法はないものか...。

ちなみに作ったコードはこんな感じ。
== 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()
  }
}