JRuby+swingで画像をドラッグ&ドロップで表示する(JPanel)
前回、ファイルをドラッグ&ドロップしてファイル名をテキスト表示できたので、今度はドラッグ&ドロップで画像表示に挑戦してみました。
以下に、サンプルプログラムを記載します。
require 'java' DataFlavor = java.awt.datatransfer.DataFlavor %w[ JFrame JPanel ImageIcon TransferHandler ].each{|c| eval c+"=javax.swing."+c} class FileDropHandler < TransferHandler def initialize(viewer) super() @viewer = viewer end def canImport(support) unless support.is_drop return false end support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) end def importData(support) begin if support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) filelist = support.transferable.get_transfer_data(DataFlavor.javaFileListFlavor) @viewer.img_name = filelist.to_a[0].to_s @viewer.repaint else return false end rescue => e puts e.message false end true end end class Canvas < JPanel attr_accessor :img_name def initialize super() self.transfer_handler = FileDropHandler.new(self) end def paintComponent g g.clear_rect 0, 0, size.width, size.height if @img_name img = ImageIcon.new(@img_name).image g.draw_image img, 0, 0, img.width, img.height, self end end end frame = JFrame.new "Image Viewer" frame.default_close_operation = JFrame::EXIT_ON_CLOSE frame.content_pane.add Canvas.new frame.pack frame.set_size(600,400) frame.visible = true
実行すると、ウィンドウが表示されますので、Windowsのデスクトップとかに置いてある画像をパネル上へドラッグ&ドロップしてみてください。
その画像が表示されると思います。
感想
うまくできました。ファイルチェックとかもろもろの機能は省いていますが。。
ぜいたく言うと、FileDropHandlerをもう少しコンパクトに書けるといいのにと思います。