2010-12-11 16 views
1

ボタンをクリックした後にactionPerfomedでjavaのルックアンドフィールを使用すると、エフェクトの変更が正しく機能しない場合があります。Javaのルックアンドフィールとメイン

しかし、同じコードをmainに置くと正しく動作します。

この解決策は何ですか?

+0

ルック・アンド・フィールの変更(どのように変更するのですか?)は[新しく作成されたJFrames]に影響します(http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/JFrame)。 .html#setDefaultLookAndFeelDecorated(boolean)) – khachik

答えて

3

guiをレイアウトする前にルック・アンド・フィールを変更すると、すべてのGUIコンポーネントが自分自身を描画する方法を知っています。

UIManager.setLookAndFeel(lnfName); 
SwingUtilities.updateComponentTreeUI(frame); 
frame.pack(); 

が、これについてjava documentationを参照してください:あなたは後の段階でそれを変更する場合は、変更は、すべてのコンポーネントに伝搬させるためのUIツリーを更新する必要があります。

これは、ボタンを押したときの外観を変更し、感じの簡単な例です:

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Test"); 

    frame.add(new JButton(new AbstractAction("Press to change") { 

     int current = 0; 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels(); 
      LookAndFeelInfo laf = lafs[current++ % lafs.length]; 

      try { 
       UIManager.setLookAndFeel(laf.getClassName()); 
       SwingUtilities.updateComponentTreeUI(frame); 
       frame.pack(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    })); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
} 

したくない場合はpackframe(それのサイズを変更する)だけではなく、repaintを呼び出すこと。

関連する問題