kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

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