2010-05-04 100 views
2

我正在开发一个swing应用程序,我可以通过点击一个按钮来改变应用程序的外观。现在我的问题是,当我点击按钮来更改主题时,它没有正确更新我的应用程序的L & F,并说我以前的主题是“noire”,我选择了“MCWin”,但noire主题的样式是还有为什么外观没有正确更新?

下面是示例工作代码:

package whiteboard; 

    import java.awt.GridBagLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ComponentEvent; 
    import java.awt.event.ComponentListener; 
    import javax.swing.JFrame; 
    import javax.swing.JLayeredPane; 
    import javax.swing.JMenu; 
    import javax.swing.JMenuBar; 
    import javax.swing.JMenuItem; 
    import javax.swing.SwingUtilities; 
    import javax.swing.UIManager; 
    import javax.swing.WindowConstants; 



    public class DiscussionBoard extends JFrame implements ComponentListener,ActionListener { 

     // Variables declaration 
     private JMenuItem audioMenuItem; 
     private JMenuItem boardMenuItem; 
     private JMenuItem exitMenuItem; 
     private JMenuItem clientsMenuItem; 
     private JMenuItem acryl; 
     private JMenuItem hifi; 
     private JMenuItem aero; 
     private JMenuItem aluminium; 
     private JMenuItem bernstein; 
     private JMenuItem fast; 
     private JMenuItem graphite; 
     private JMenuItem luna; 
     private JMenuItem mcwin; 

     private JMenuItem noire; 
     private JMenuItem smart; 
     private JMenuBar boardMenuBar; 

     private JMenuItem messengerMenuItem; 
     private JMenu openMenu; 
     private JMenu saveMenu; 
     private JMenu themesMenu; 
     private JMenuItem saveMessengerMenuItem; 
     private JMenuItem saveWhiteboardMenuItem; 
     private JMenu userMenu; 


     JLayeredPane layerpane; 


     /** Creates new form discussionBoard 
     * @param connection */ 
     public DiscussionBoard() 
     {  

      initComponents(); 
      setLocationRelativeTo(null); 
      addComponentListener(this); 

     } 

     private void initComponents() { 

      boardMenuBar = new JMenuBar(); 
      openMenu = new JMenu(); 
      themesMenu = new JMenu(); 
      messengerMenuItem = new JMenuItem(); 
      boardMenuItem = new JMenuItem(); 
      audioMenuItem = new JMenuItem(); 
      saveMenu = new JMenu(); 
      saveMessengerMenuItem = new JMenuItem(); 
      saveWhiteboardMenuItem = new JMenuItem(); 
      userMenu = new JMenu(); 
      clientsMenuItem = new JMenuItem(); 
      exitMenuItem = new JMenuItem(); 

      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
      setLayout(new GridBagLayout()); 
      setResizable(false); 
      setTitle("Discussion Board"); 

      openMenu.setText("Open"); 
      saveMenu.setText("Save"); 
      themesMenu.setText("Themes"); 
      acryl = new JMenuItem("Acryl"); 
      hifi = new JMenuItem("HiFi"); 
      aero = new JMenuItem("Aero"); 
      aluminium = new JMenuItem("Aluminium"); 
      bernstein = new JMenuItem("Bernstein"); 
      fast = new JMenuItem("Fast"); 
      graphite = new JMenuItem("Graphite"); 
      luna = new JMenuItem("Luna"); 
      mcwin = new JMenuItem("MCwin");  
      noire = new JMenuItem("Noire"); 
      smart = new JMenuItem("Smart"); 


      hifi.addActionListener(this); 
      acryl.addActionListener(this); 
      aero.addActionListener(this); 
      aluminium.addActionListener(this); 
      bernstein.addActionListener(this); 
      fast.addActionListener(this); 
      graphite.addActionListener(this); 
      luna.addActionListener(this); 
      mcwin.addActionListener(this);  
      noire.addActionListener(this); 
      smart.addActionListener(this); 

      messengerMenuItem.setText("Messenger");  
      openMenu.add(messengerMenuItem);   
      openMenu.add(boardMenuItem); 
      audioMenuItem.setText("Audio Messenger"); 
      openMenu.add(audioMenuItem); 
      exitMenuItem.setText("Exit"); 
      exitMenuItem.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent evt) { 
        exitMenuItemActionPerformed(evt); 
       } 
      }); 
      openMenu.add(exitMenuItem); 

      boardMenuBar.add(openMenu);  

      saveMessengerMenuItem.setText("Messenger"); 

      saveMenu.add(saveMessengerMenuItem); 

      saveWhiteboardMenuItem.setText("Whiteboard");  

      saveMenu.add(saveWhiteboardMenuItem); 

      boardMenuBar.add(saveMenu); 

      userMenu.setText("Users"); 
      clientsMenuItem.setText("Current Session"); 

      userMenu.add(clientsMenuItem);  
      themesMenu.add(acryl); 
      themesMenu.add(hifi);  
      themesMenu.add(aero); 
      themesMenu.add(aluminium); 
      themesMenu.add(bernstein); 
      themesMenu.add(fast); 
      themesMenu.add(graphite); 
      themesMenu.add(luna); 
      themesMenu.add(mcwin);  
      themesMenu.add(noire); 
      themesMenu.add(smart); 
      boardMenuBar.add(userMenu); 
      boardMenuBar.add(themesMenu); 
      saveMessengerMenuItem.setEnabled(false); 
      saveWhiteboardMenuItem.setEnabled(false); 

      setJMenuBar(boardMenuBar); 
      setSize(1024, 740);  
      setVisible(true); 
     } 

     protected void exitMenuItemActionPerformed(ActionEvent evt) { 
      System.exit(0);  
     } 
     @Override 
     public void componentHidden(ComponentEvent arg0) { 

     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 

     } 

     @Override 
     public void componentResized(ComponentEvent arg0) { 

     } 

     @Override 
     public void componentShown(ComponentEvent arg0) { 

     } 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      try 
      { 

       if(e.getSource()==hifi) 
       { 
         UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
         SwingUtilities.updateComponentTreeUI(getRootPane()); 
         UIManager.setLookAndFeel("com.jtattoo.plaf.hifi.HiFiLookAndFeel"); 
         enableTheme(); 
         hifi.setEnabled(false); 
       } 
       else if(e.getSource()==acryl) 
       { 
        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel"); 
        enableTheme(); 
        acryl.setEnabled(false); 
       } 
       else if(e.getSource()==aero) 
       { 
        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.aero.AeroLookAndFeel"); 
        enableTheme(); 
        aero.setEnabled(false); 
       } 
       else if(e.getSource()==aluminium) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"); 
        enableTheme(); 
        aluminium.setEnabled(false); 
       } 
       else if(e.getSource()==bernstein) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel"); 
        enableTheme(); 
        bernstein.setEnabled(false); 
       } 
       else if(e.getSource()==fast) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.fast.FastLookAndFeel"); 
        enableTheme(); 
        fast.setEnabled(false); 
       } 
       else if(e.getSource()==graphite) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.graphite.GraphiteLookAndFeel"); 
        enableTheme(); 
        graphite.setEnabled(false); 
       } 
       else if(e.getSource()==luna) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.luna.LunaLookAndFeel"); 
        enableTheme(); 
        luna.setEnabled(false); 
       } 
       else if(e.getSource()==mcwin) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel"); 
        enableTheme(); 
        mcwin.setEnabled(false); 
       } 

       else if(e.getSource()==noire) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel"); 
        enableTheme(); 
        noire.setEnabled(false); 
       } 
       else if(e.getSource()==smart) 
       { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        SwingUtilities.updateComponentTreeUI(getRootPane()); 
        UIManager.setLookAndFeel("com.jtattoo.plaf.smart.SmartLookAndFeel"); 
        enableTheme(); 
        smart.setEnabled(false); 
       } 
       SwingUtilities.updateComponentTreeUI(getRootPane());  
      } 
      catch (Exception ex) 
      { 
       ex.printStackTrace(); 
      } 
     } 
     private void enableTheme() 
     { 
      acryl.setEnabled(true); 
      hifi.setEnabled(true);  
      aero.setEnabled(true); 
      aluminium.setEnabled(true); 
      bernstein.setEnabled(true); 
      fast.setEnabled(true); 
      graphite.setEnabled(true); 
      luna.setEnabled(true); 
      mcwin.setEnabled(true);  
      noire.setEnabled(true); 
      smart.setEnabled(true); 
     } 

     public static void main(String []ar) 
     { 
      try 
      { 
       UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel");    
      } 
      catch (Exception e) 
      {   
       e.printStackTrace(); 
      } 
      new DiscussionBoard(); 
     } 
    } 

这里有什么问题吗?为什么它没有得到更新?

有一个演示应用程序here正在做我想要的东西,但我无法得到一个清晰的想法。

Edit:对不起,忘了指定的库文件,here这是

+0

您正在使用第三方L&F('com.jtattoo')。它们是否在您的类路径中,或者当您尝试切换LookAndFeels时是否收到'ClassNotFoundException'? – 2010-05-04 06:22:18

+0

对不起彼得,我忘了指定库文件链接。 你可以在这里找到它 http://www.jtattoo.net/downloads/JTattooDemo.jar – swift 2010-05-04 06:29:41

+1

只是一个侧面说明:我会清理其他 - 如果通过分解一个常用的方法的子句。参数可以是L&F名称和JMenuItem的常量 – 2010-05-04 06:32:33

回答

0

我不知道是什么导致了这一点,但你必须看看updateUI-method

从API文档:用值从当前外观

重置UI属性和感觉。

+0

什么updateUI方法可以在这里做什么?我不能让你 – swift 2010-05-04 07:00:45

+0

我不确定它究竟做了什么。我只是发现了API中的描述与问题之间的联系,以及代码中缺少调用。 – aioobe 2010-05-04 07:11:22

0

我想你的例子,它只是运行良好:

alt text http://img401.imageshack.us/img401/3285/so2763157.png


我试了一下从以下文件的命令行(DiscussionBoard.java目录whiteboard):

JTattooDemo.jar 
whiteboard/DiscussionBoard.java 

javac whiteboard/DiscussionBoard.java 
java -cp ".;JTattooDemo.jar" whiteboard/DiscussionBoard 

注意,JTattoo仅用于非商业用途免费

+0

它不会显示任何错误,但问题是它不会正确更新主题,尝试随机选择主题,至少10个主题,它不会看它应该如何。请参阅以下链接中的屏幕截图 http://www.jtattoo.net/ScreenShots.html – swift 2010-05-04 07:34:09

+0

Ya peter我没有使用商业应用的主题 – swift 2010-05-04 07:37:45

+0

@swift:我试图用您提供的代码更改L&F至少30次,一切似乎都按预期改变(标题栏,图标和菜单)...... – 2010-05-04 07:41:13

1

SwingUtilities.updateComponentTreeUI(getRootPane());呼叫移到建立LnF的呼叫之后。它在传递组件下面的树中的所有组件上调用updateUI。现在,您正在更新UI并更改它们。