JRuby+swingでJFileChooserを試す

swingで外部ファイルを選択して何か操作するとき、"JFileChooser"を使うと便利です。
JFileChooserはファイル選択のための専用ダイアログで、使用するのがとても簡単です。
何かしらアプリを作ろうと思った時使いそうなのでメモします。


以下に全ソースコードを示します。

# coding: cp932
require 'java'

(<<AWT).split.each {|c| eval "#{c} = java.awt.#{c}" }
  BorderLayout
AWT

(<<SWING).split.each {|c| eval "#{c} = javax.swing.#{c}" }
  JFrame JButton JTextField JPanel
  JFileChooser
SWING

class MyFrame < JFrame
  def initialize
    super "File Chooser Test"
    self.default_close_operation = JFrame::EXIT_ON_CLOSE

    button = JButton.new "ファイル選択"
    field = JTextField.new 32

    buttonPanel = JPanel.new
    buttonPanel.add button
    self.content_pane.add buttonPanel, BorderLayout::PAGE_END

    fieldPanel = JPanel.new
    fieldPanel.add field
    self.content_pane.add fieldPanel, BorderLayout::CENTER

    button.add_action_listener do |event|
      filechooser = JFileChooser.new
      case filechooser.show_save_dialog(self)
      when JFileChooser::APPROVE_OPTION
        file = filechooser.get_selected_file
        field.text = file.name
#        field.text = file.path
      when JFileChooser::CANCEL_OPTION
        field.text = "キャンセルされました."
      when JFileChooser::ERROR_OPTION
        field.text = "エラー."
      end
    end
  end # of initialize

  def main
    self.pack
    self.set_size(400,100)
    self.visible = true
  end
end # of MyFrame

#ルックアンドフィール設定
begin
  UIManager::look_and_feel = UIManager::system_look_and_feel_class_name
#  SwingUtilities::update_component_tree_ui frame
rescue => e
  puts e.message
end

f = MyFrame.new
f.main

label.text = file.name
の行で、fileは"java.io.File"クラスのインスタンスです。
ラベルにファイル名だけでなくファイルまでの絶対パスも表示させたいときは、file.path とすればよさそうです。

あと、細かいことですがルックアンドフィール設定を入れています。これはおまけです。
デフォルトの"metal"はWindowsだと(好みの問題ですが)いまいちなのでシステムに依存させて変えるようにしています。(貼りつけた画像はmetalなんですけどねw)

まとめ

これぐらい行数ならclassとか使わないでベタ書きでもと思ったのですが、さすがにまとまりが悪いかなぁと思ったので、MyFrameというクラスで括って(気持ち)記述の見栄えをよくしてみました。