2010-12-11 109 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 2010-12-11 08:39:05

回答

3

当您在布局GUI之前更改外观和感觉所有GUI组件都知道如何绘制自己。如果你在稍后的阶段改变它,你需要更新UI树进行更改传播到所有组件:

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

java documentation这个问题。

这是一个简单的例子,按下按钮时,改变了外观和感觉:

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代替。