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

时间:2018-07-30 13:46:38

标签: java swing look-and-feel

环境:

使用Netbeans 8.1

Oracle JDK 1.8

Win 10专业版

上下文:

具有JCheckBoxMenuItem的GUI,可在运行时更改LookAndFeel(LAF)。

darkLAF = JTattoo的HiFi LAF

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内

    <canvas id="myCanvas"></canvas>

捕获:

  1. 不应要求用户重新启动GUI。

1 个答案:

答案 0 :(得分:1)

这有点困难,但是我找到了解决方法。

您需要切换到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

}