代码之家  ›  专栏  ›  技术社区  ›  lineage

SwingUtilities.updateComponentTreeUI()不更改JFrames标题栏

  •  0
  • lineage  · 技术社区  · 7 年前

    环境:

    使用Netbeans 8.1

    Oracle JDK 1.8版

    赢得10场比赛

    上下文:

    一个带有JCheckBoxMenuItem的GUI,可以在运行时更改LookAndFeel(LAF)。

    达拉夫= JTattoo 高保真激光

    defaultLAF=Sun的Windows LAF(com.Sun.java.swing.plaf.Windows.WindowsLookAndFeel)

    问题:

    1. GUI使用defaultLAF启动(在EDT中)。用户更改为darkLAF..标题栏应该已经更改..它没有。

    2. 当用户切换回defaultLAF时,JMenuItems(文件和编辑)显示的是灰色背景,而不是defaultLAF样式。

    截图:

    1. The launched defaultLAF

    2. upon switching to darkLAF

    3. user switched back to defaultLAF
    4. expected look for darkLAF

    代码:

    1. 在JCheckBoxMenuItem的itemStateChangeListener中

      try{
         if (checkBox.isSelected())                                                                 
            UIManager.setLookAndFeel(darkLookAndFeel);
         else
          UIManager.setLookAndFeel(defaultLookAndFeel);
      
      
      } catch (UnsupportedLookAndFeelException ex) {
         //handle err
      }
      
      //GUI is a class extending JFrame        
      SwingUtilities.updateComponentTreeUI(this);
      //some JFileChooser
      SwingUtilities.updateComponentTreeUI(fc);
      
      pack();
      

    捕获:

    1. 不应要求用户重新启动GUI。
    1 回复  |  直到 7 年前
        1
  •  1
  •   Sergiy Medvynskyy    7 年前

    有点难,但我找到了解决办法。

    您需要切换到JTatto L&F的步骤

    1. 丢弃窗口
    2. 设置L&F
    3. 将根窗格的窗口样式设置为 JRootPane.FRAME
    4. 更新用户界面
    5. 使框架不装饰
    6. 使框架可见

    切换回Windows L&F所需的步骤

    1. 丢弃窗口
    2. 设置L&F
    3. 更新用户界面
    4. 装裱
    5. 使框架可见

    这是密码

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class MinFrame extends JFrame {
    
        public MinFrame() {
            super("Minimal-Frame-Application");
    
            // setup menu
            JMenuBar menuBar = new JMenuBar();
            JMenu menu = new JMenu("File");
            menu.setMnemonic('F');
            JMenuItem menuItem = new JMenuItem("Exit");
            menuItem.setMnemonic('x');
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, KeyEvent.ALT_MASK));
            menuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    System.exit(0);
                }
            });
            menu.add(menuItem);
            menuBar.add(menu);
            setJMenuBar(menuBar);
    
            // setup widgets
            JPanel contentPanel = new JPanel(new BorderLayout());
            contentPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
            JScrollPane westPanel = new JScrollPane(new JTree());
            JEditorPane editor = new JEditorPane("text/plain", "Hello World");
            JScrollPane eastPanel = new JScrollPane(editor);
            JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, westPanel,eastPanel);
            splitPane.setDividerLocation(148);
            contentPanel.add(splitPane, BorderLayout.CENTER);
    
    
            AbstractButton winLF = new JButton("Windows");
            winLF.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        MinFrame.this.dispose();
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                        SwingUtilities.updateComponentTreeUI(MinFrame.this.getRootPane());
    
                        MinFrame.this.setUndecorated(false);
                        MinFrame.this.setVisible(true);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
            AbstractButton customLF = new JButton("JTatto");
            customLF.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        MinFrame.this.dispose();
                        UIManager.setLookAndFeel("com.jtattoo.plaf.smart.SmartLookAndFeel");
                        MinFrame.this.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
                        SwingUtilities.updateComponentTreeUI(MinFrame.this.getRootPane());
    
                        MinFrame.this.setUndecorated(true);
                        MinFrame.this.setVisible(true);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
    
            JPanel buttons = new JPanel();
            buttons.add(winLF);
            buttons.add(customLF);
            contentPanel.add(buttons, BorderLayout.SOUTH);
            setContentPane(contentPanel);
    
            // add listeners
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
            // show application
            setLocation(32, 32);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 300);
            setVisible(true);
        } // end CTor MinFrame
    
        public static void main(String[] args) {
            try {
                // select Look and Feel
    //            UIManager.setLookAndFeel("com.jtattoo.plaf.smart.SmartLookAndFeel");
                // start application
                new MinFrame();
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
        } // end main
    
    }