読者です 読者をやめる 読者になる 読者になる

はじめてのswing on jruby その四

jruby ruby swing

今回はFileChooserを使ってファイルを選択し、画像を貼付けてみます。

画像ファイルを開くボタンをクリックしたらファイル選択画面が開き、

画像を選択してOKを押すと画像が貼付けられるという単純なアプリです。
まず、javaのソースはこちら。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

class JFileChooserSample extends JFrame {
  ImageIcon icon = null;
  JLabel label = new JLabel();
  public static void main ( String[] args){
    JFileChooserSample w=new JFileChooserSample("ファイル選択");
    w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    w.setSize(350,300);
    w.setVisible(true);
  }
  JFileChooserSample(String title){
    super(title);
    JPanel pane=(JPanel)getContentPane();
    JToolBar tool=new JToolBar();
    pane.add(tool,BorderLayout.NORTH);
    tool.add(new LoadImageFile("画像ファイルを開く"));
    pane.add(label,BorderLayout.CENTER);
  }
  class LoadImageFile extends AbstractAction{
    LoadImageFile(String text){super(text);}
    public void actionPerformed(ActionEvent e){
      JFileChooser fileChooser = new JFileChooser(".");
      fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
      fileChooser.setDialogTitle("画像選択");
      int ret = fileChooser.showOpenDialog(label);
      if(ret!=JFileChooser.APPROVE_OPTION) return;
      String fileName = fileChooser.getSelectedFile().getAbsolutePath();
      icon = new ImageIcon(fileName);
      label.setIcon(icon);
    }
  }
}

JRubyだとこちら

require 'java'
import javax.swing.JFileChooser
import javax.swing.JFrame
import javax.swing.JToolBar
import javax.swing.ImageIcon
import javax.swing.AbstractAction
import javax.swing.JLabel
import java.awt.BorderLayout

class JFileChooserSample < javax.swing.JFrame
  def initialize(title)
    super title
    pane=get_content_pane
    tool=JToolBar.new
    pane.add(tool,BorderLayout::NORTH)
    image_label=JLabel.new
    tool.add(LoadImageFile.new("画像ファイルを開く",image_label))
    pane.add(image_label,BorderLayout::CENTER)
  end
  class LoadImageFile < AbstractAction
    def initialize(text,label)
      super text
      @label=label
    end
    def actionPerformed(e)
      file_chooser=JFileChooser.new(".")
      file_chooser.file_selection_mode=JFileChooser::FILES_ONLY
      file_chooser.dialog_title="画像選択"
      ret=file_chooser.show_open_dialog(@label)
      return unless ret==JFileChooser::APPROVE_OPTION
      file_name=file_chooser.selected_file.absolute_path
      icon=ImageIcon.new(file_name)
      @label.setIcon(icon)
    end
  end
end
w=JFileChooserSample.new("ファイル選択")
w.default_close_operation=(javax.swing.JFrame::EXIT_ON_CLOSE)
w.set_size(350,300)
w.visible=true

変数のスコープの違いに大分戸惑いました。
JavaではLoadImageFileの中から呼び出し元のクラスに入っている
labelを引っ張ってくることができます。
しかし、rubyだと引っ張って来れません。
しかたないので、newするときに一緒に呼び出し先にimage_labelという名前で
渡しています。JRubyの流儀があったら知りたいです。