はじめてのswing on jruby その四
今回は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の流儀があったら知りたいです。