ルックアンドフィールを設定する

swingはルックアンドフィールを設定できます。
調べるのに意外と苦労したのでメモしておきます。
知っている人にとってはどおってことない話だと思いますが。。

ルックアンドフィール一覧表示

まずは設定できる種類を一覧表示してみます。

require 'java'
import javax.swing.UIManager

looks = UIManager::installed_look_and_feels
looks.each do |look|
  puts "#{look.class_name}"
end

puts "---system default---"
puts UIManager::system_look_and_feel_class_name
javax.swing.plaf.metal.MetalLookAndFeel
javax.swing.plaf.nimbus.NimbusLookAndFeel
com.sun.java.swing.plaf.motif.MotifLookAndFeel
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
---system default---
com.sun.java.swing.plaf.windows.WindowsLookAndFeel

ふむ、なるほどなるほど、windows7で実行してみたら上記の5種類が使えるようです。

ルックアンドフィールの適用

実際に適用してみます。

require 'java'
import javax.swing.JFrame
import javax.swing.JButton
import javax.swing.UIManager

looks = UIManager::installed_look_and_feels
UIManager::look_and_feel = looks[3].class_name

frame = JFrame.new "sample"
button = JButton.new "push"

frame.add button
frame.default_close_operation = JFrame::EXIT_ON_CLOSE
frame.pack
frame.visible = true
  • デフォルト"MetalLookAndFeel"

  • "WindowsLookAndFeel"

おぉ!!確かに見た目がかわったぞ。
設定するには、
UIManager::look_and_feel
でできるようです。
ここで注意するのは、渡すパラメタは文字列ということです。
なのでclass_nameというメソッドでクラス名の文字列を取得しています。

動的にルックアンドフィールの切り替え

で、次がボタンを押して動的に切り替えるサンプルです。

require 'java'
import javax.swing.JFrame
import javax.swing.JButton
import javax.swing.UIManager
import javax.swing.SwingUtilities

frame = JFrame.new "sample"
button = JButton.new "push"

index = 0
button.add_action_listener do |event|
  looks = UIManager::installed_look_and_feels
  index = (index+1)%looks.size
  UIManager::look_and_feel = looks[index].class_name
  SwingUtilities::update_component_tree_ui frame
  puts "select : #{looks[index].class_name}"
end

frame.add button
frame.default_close_operation = JFrame::EXIT_ON_CLOSE
frame.pack
frame.visible = true

かなり適当な感じですが、ボタンを押すたびに切り替えることができました。
ここで大事なのが
UIManager::look_and_feel = looks[index].class_name
SwingUtilities::update_component_tree_ui frame
のところです。
look_and_feelで設定したあと、更新を知らせるためにupdate_component_tree_uiを呼びます。

まとめ

やっぱり簡単なGUIアプリでも見た目って大事だと思います。
自分だけで使う分には別に構わないのですが、人に使ってもらおうと思ったときにswingのデフォルトってWindowsユーザにとっては馴染みがないので見た目で受け入れられなかったり、、、自分もそうなので。
とりあえず、知りたいことがわかったので満足です。