SwingUtilities.updateComponentTreeUI()不会更改JFrames标题栏 [英] SwingUtilities.updateComponentTreeUI() not changing JFrames titlebar

查看:384
本文介绍了SwingUtilities.updateComponentTreeUI()不会更改JFrames标题栏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

环境:

使用Netbeans 8.1

Using Netbeans 8.1

Oracle JDK 1.8

Oracle JDK 1.8

Win 10专业版

上下文:

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

A GUI with a JCheckBoxMenuItem to change LookAndFeel(LAF) at runtime.

darkLAF = JTattoo 的HiFi LAF

darkLAF=JTattoo's HiFi LAF

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

defaultLAF=Sun's Windows LAF(com.sun.java.swing.plaf.windows.WindowsLookAndFeel)

问题:

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

  1. GUI launches(in EDT) with defaultLAF. User changes to darkLAF..the title bar should have changed..it doesn't.

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

When the user switches back to defaultLAF, the JMenuItems(File and Edit) show greyer backgrounds not the defaultLAF style.

屏幕截图:

  1. 已启动的默认LAF

切换到darkLAF

代码:

  1. 在JCheckBoxMenuItem的itemStateChangeListener内

  1. Inside the itemStateChangeListener for JCheckBoxMenuItem

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.

推荐答案

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

It was a little bit hard, but I've found a solution.

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

Steps you need to switch to the JTatto L&F

  1. 处理窗口
  2. 设置L& F
  3. 将根窗格的窗口样式设置为JRootPane.FRAME
  4. 更新用户界面
  5. 使框架未经装饰
  6. 使框架可见
  1. Dispose window
  2. Set L&F
  3. Set window style of root pane to JRootPane.FRAME
  4. Update UI
  5. Make Frame undecorated
  6. Make Frame visible

您需要切换回Windows L& F的步骤

Steps you need to switch back to 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

}

这篇关于SwingUtilities.updateComponentTreeUI()不会更改JFrames标题栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆