SwingUtilities.updateComponentTreeUI()不会更改JFrames标题栏 [英] SwingUtilities.updateComponentTreeUI() not changing JFrames titlebar
问题描述
环境:
使用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)
问题:
-
GUI使用defaultLAF启动(在EDT中).用户更改为darkLAF ..标题栏应该已更改..它没有更改.
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.
屏幕截图:
代码:
-
在JCheckBoxMenuItem的itemStateChangeListener内
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();
捕获:
- 不应要求用户重新启动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
- 处理窗口
- 设置L& F
- 将根窗格的窗口样式设置为
JRootPane.FRAME
- 更新用户界面
- 使框架未经装饰
- 使框架可见
- Dispose window
- Set L&F
- Set window style of root pane to
JRootPane.FRAME
- Update UI
- Make Frame undecorated
- Make Frame visible
您需要切换回Windows L& F的步骤
Steps you need to switch back to Windows L&F
- 处理窗口
- 设置L& F
- 更新用户界面
- 装饰框架
- 使框架可见
这是代码
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屋!