2010-12-11 4 views
1

Если я использую java внешний вид в actionPerfomed после нажатия кнопки, изменение эффекта работает некорректно, вместо этого оно слегка меняется.внешний вид и внешний вид java

Однако, если я поместил тот же код на основной, он работает правильно.

Для чего это будет предназначаться?

+0

Изменение внешнего вида (как вы его изменяете, BTW?) Влияет на [вновь созданные 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 об этом.

Это простой пример, который изменяет внешний вид при нажатии кнопки:

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 вместо этого.

Смежные вопросы