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をもう少しコンパクトに書けるといいのにと思います。