ルックアンドフィールを設定する
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を呼びます。