JRuby Swing ファイルのドラッグ&ドロップ
JRubyのSwingを使用して、エクスプローラからファイルのドラッグ&ドロップを受け取るデモアプリを作ってみました。
require 'java' import 'java.awt.BorderLayout' import 'java.awt.datatransfer.DataFlavor' import 'java.awt.datatransfer.Transferable' import 'java.awt.dnd.DnDConstants' import 'java.awt.dnd.DropTarget' import 'java.awt.dnd.DropTargetAdapter' import 'java.awt.event.ActionListener' import 'javax.swing.JButton' import 'javax.swing.JFrame' import 'javax.swing.JPanel' import 'javax.swing.JTextArea' class FileDropFrame < JFrame def initialize super("JRuby Swing Demo") set_size(400, 300) textarea = JTextArea.new exitbtn = JButton.new("終了") exitbtn.add_action_listener(ExitAction.new(self)) panel = JPanel.new panel.set_layout(BorderLayout.new) panel.add(textarea, BorderLayout::CENTER) panel.add(exitbtn, BorderLayout::SOUTH) get_content_pane.add(panel, BorderLayout::CENTER) set_default_close_operation(JFrame::EXIT_ON_CLOSE) adapter = MyDropTargetAdapter.new adapter.textarea = textarea DropTarget.new(textarea, adapter) end end class MyDropTargetAdapter < DropTargetAdapter attr_accessor :textarea def drop(dtde) if dtde.is_data_flavor_supported(DataFlavor.javaFileListFlavor) dtde.accept_drop(DnDConstants::ACTION_COPY) transferable = dtde.get_transferable filelist = transferable.get_transfer_data(DataFlavor.javaFileListFlavor) @textarea.text = filelist.to_s dtde.drop_complete(true) end end end class ExitAction include ActionListener def initialize(frame) @frame = frame end def actionPerformed(event) @frame.dispose end end frame = FileDropFrame.new frame.visible = true