2013-03-27 37 views
1

您好,我有一个用户可以更改外观和感觉的界面。下面是接口:更改摇摆应用程序的外观(UIManager)时出错

http://www.hostingpics.net/viewer.php?id=579250themesApp.jpg

每个按钮的代码:

//The JDesktop Frame contains all the Internal Frames 
JDesktop p = new JDesktop(); 
try { 
      UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel()); 

     SwingUtilities.updateComponentTreeUI(p); 
     } catch (UnsupportedLookAndFeelException ex) { 
      Logger.getLogger(paramApparence.class.getName()).log(Level.SEVERE, null, ex); 
     } 

对于每一个按钮,我只改变了外观和感觉(金属/雨云等)

当我点击按钮以改变它给我的外观和感觉:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 

下面是完整的堆栈跟踪:代替另一个woodoos

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at sun.font.FontDesignMetrics$MetricsKey.init(FontDesignMetrics.java:217) 
    at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:286) 
    at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1012) 
    at javax.swing.JComponent.getFontMetrics(JComponent.java:1624) 
    at sun.swing.MenuItemLayoutHelper.reset(MenuItemLayoutHelper.java:125) 
    at javax.swing.plaf.synth.SynthMenuItemLayoutHelper.<init>(SynthMenuItemLayoutHelper.java:119) 
    at javax.swing.plaf.synth.SynthGraphicsUtils.paint(SynthGraphicsUtils.java:498) 
    at javax.swing.plaf.synth.SynthMenuUI.paint(SynthMenuUI.java:283) 
    at javax.swing.plaf.synth.SynthMenuUI.update(SynthMenuUI.java:248) 
    at javax.swing.JComponent.paintComponent(JComponent.java:778) 
    at javax.swing.JComponent.paint(JComponent.java:1054) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) 
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) 
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at sun.font.FontDesignMetrics$MetricsKey.init(FontDesignMetrics.java:217) 
    at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:286) 
    at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1012) 
    at javax.swing.JComponent.getFontMetrics(JComponent.java:1624) 
    at sun.swing.MenuItemLayoutHelper.reset(MenuItemLayoutHelper.java:126) 
    at javax.swing.plaf.synth.SynthMenuItemLayoutHelper.<init>(SynthMenuItemLayoutHelper.java:119) 
    at javax.swing.plaf.synth.SynthGraphicsUtils.paint(SynthGraphicsUtils.java:498) 
    at javax.swing.plaf.synth.SynthMenuItemUI.paint(SynthMenuItemUI.java:283) 
    at javax.swing.plaf.synth.SynthMenuItemUI.update(SynthMenuItemUI.java:247) 
    at javax.swing.JComponent.paintComponent(JComponent.java:778) 
    at javax.swing.JComponent.paint(JComponent.java:1054) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) 
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) 
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at sun.font.FontDesignMetrics$MetricsKey.init(FontDesignMetrics.java:217) 
    at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:286) 
    at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1012) 
    at javax.swing.JComponent.getFontMetrics(JComponent.java:1624) 
    at sun.swing.MenuItemLayoutHelper.reset(MenuItemLayoutHelper.java:126) 
    at javax.swing.plaf.synth.SynthMenuItemLayoutHelper.<init>(SynthMenuItemLayoutHelper.java:119) 
    at javax.swing.plaf.synth.SynthGraphicsUtils.paint(SynthGraphicsUtils.java:498) 
    at javax.swing.plaf.synth.SynthMenuItemUI.paint(SynthMenuItemUI.java:283) 
    at javax.swing.plaf.synth.SynthMenuItemUI.update(SynthMenuItemUI.java:247) 
    at javax.swing.JComponent.paintComponent(JComponent.java:778) 
    at javax.swing.JComponent.paint(JComponent.java:1054) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) 
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) 
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 
+3

发布完整的堆栈跟踪 – Apurv 2013-03-27 11:44:06

回答

1

例如(的适当的方法之一)

enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

默认需要JFrame.pack(),如setVisible(false) and then true,或DecorationsType for JFrame

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 

public class TestInternalFrame { 

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

    public TestInternalFrame() { 
     final JInternalFrame internal = new JInternalFrame("test"); 
     final JInternalFrame hidden = new JInternalFrame("test"); 
     hidden.setBounds(1000, 1000, 1, 1); 
     hidden.setVisible(true); 
     internal.setVisible(true); 
     internal.setBounds(0, 0, 100, 100); 
     JDesktopPane pane = new JDesktopPane(); 
     pane.add(internal); 
     pane.add(hidden); 
     pane.setPreferredSize(new Dimension(10000, 10000)); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(new JScrollPane(pane, 
       JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)); 
     DefaultComboBoxModel model = new DefaultComboBoxModel(); 
     UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels(); 
     for (int i = 0; i < info.length; i++) { 
      model.addElement(info[i].getName()); 
     } 
     final JComboBox box = new JComboBox(model); 
     box.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
         if (box.getSelectedItem().equals(info.getName())) { 
          UIManager.setLookAndFeel(info.getClassName()); 
          UIManager.getLookAndFeel().uninitialize(); 
          UIManager.setLookAndFeel(info.getClassName()); 
          SwingUtilities.updateComponentTreeUI(frame); 
          break; 
         } 
        } 
       } catch (ClassNotFoundException ex) { 
        Logger.getLogger(TestInternalFrame.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (InstantiationException ex) { 
        Logger.getLogger(TestInternalFrame.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (IllegalAccessException ex) { 
        Logger.getLogger(TestInternalFrame.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (UnsupportedLookAndFeelException ex) { 
        Logger.getLogger(TestInternalFrame.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
     frame.add(box, BorderLayout.NORTH); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestInternalFrame tif = new TestInternalFrame(); 
      } 
     }); 
    } 
} 
+0

感谢您的回答,但我真的不明白您的所有代码,我想要做的就是在单击按钮时更改外观和感觉:UIManager.setLookAndFeel(new javax.swing.plaf.nimbus.NimbusLookAndFeel());它适用于run()方法,但是当我将这段代码添加到按钮时,它给了我以上这些错误 – Majda 2013-03-27 15:08:22

+0

不想从'box.addActionListener(new ActionListener(){...})复制代码;'并且必须这段代码作品,另一个选择/ [在此尝试使用分拣机版本](http://stackoverflow.com/a/13810494/714968),适用于在JDK1.6_010和更新版本中编译的所有Java代码 – mKorbel 2013-03-27 18:47:24

相关问题