Java 为什么外观没有得到适当的更新?

Java 为什么外观没有得到适当的更新?,java,swing,look-and-feel,Java,Swing,Look And Feel,我正在开发一个swing应用程序,在这个应用程序中,我可以选择在单击按钮时更改应用程序的外观。现在我的问题是,当我点击按钮更改主题时,它没有正确更新我的应用程序的L&F,假设我以前的主题是“noire”,然后我选择“MCWin”,但黑色主题的样式仍然存在 以下是示例工作代码: package whiteboard; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.

我正在开发一个swing应用程序,在这个应用程序中,我可以选择在单击按钮时更改应用程序的外观。现在我的问题是,当我点击按钮更改主题时,它没有正确更新我的应用程序的L&F,假设我以前的主题是“noire”,然后我选择“MCWin”,但黑色主题的样式仍然存在

以下是示例工作代码:

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();
        }
    }
这里有什么问题?为什么它没有得到更新

有一个演示应用程序,这正是我想要的,但我不能得到一个清晰的想法


编辑:
对不起,忘了指定库文件,它是

我不确定是什么原因造成的,但是您查看了吗

从API文档中:

使用当前外观的值重置UI属性


我试过你的例子,效果很好:


我在命令行中使用以下文件(
DiscussionBoard.java
目录下的
whiteboard
)进行了尝试:



请注意,仅对非商业用途免费使用。

移动
SwingUtilities.updateComponentTreeUI(getRootPane())在设置LnF的调用之后调用。它对传递的组件下面树中的所有组件调用
updateUI
。现在,您正在更新UI,然后对其进行更改。

您正在使用第三方L&Fs(
com.jtagto
)。它们是否在类路径中,或者当您尝试切换LookAndFeels时,是否会出现
ClassNotFoundException
异常?抱歉,peter,我忘了指定库文件链接。你可以在这里找到它只是一个旁注:我会通过分解出一个常用方法来清理那些else if子句。参数可以是L&F名称的常量和JMENUItem。有什么想法吗???peter??得到了jtattoo主题的答案-->在应用新主题之前,我们需要将主题重置为默认主题,这可以通过““”com.jattoo.plaf.aero.AeroLookAndFeel.setTheme(“默认”);”完成。这很好。我不确定它到底做了什么。我刚刚发现了API中的描述、您的问题和代码中缺少调用之间的联系。它不会显示任何错误,但问题是它不会正确更新主题,请尝试随机选择主题,至少10个主题,它看起来不会是应该的样子。请参见以下链接中的屏幕截图,Ya peter,我没有将该主题用于商业用途app@swift:我尝试用您提供的代码更改L&F至少30次,但一切似乎都如预期的那样更改(标题栏、图标和菜单)。。。
JTattooDemo.jar
whiteboard/DiscussionBoard.java
javac whiteboard/DiscussionBoard.java
java -cp ".;JTattooDemo.jar" whiteboard/DiscussionBoard