gpt4 book ai didi

java - SwingUtilities.updateComponentTreeUI() 不更改仅适用于 UNIX 皮肤的 JFrames 标题栏

转载 作者:行者123 更新时间:2023-12-02 09:35:27 25 4
gpt4 key购买 nike

环境:Win 10 和 Java SDK 12.01(也在 Java 8 上测试)

问题类似于:

SwingUtilities.updateComponentTreeUI() not changing JFrames titlebar

但是在我应用提供的解决方案后,Unix 外观更改仍然无法正常工作(更改为 Unix 外观后标题栏仍然未更新或(在我应用 setUndecorated() 方法后 - 根本不可见)。

我将单选按钮切换到 Windows 皮肤的地方 - 正常工作:

windows skin - correct case

但是当我将单选按钮切换到 Unix 皮肤时 - 除了标题栏之外,所有组件都被刷新得很好 - 它消失了:

Unix skin - issue: title bar not visible

或者,当我删除行时:

notepadWindow.setUndecorated(true);

来自 switch 语句中的 case UNIX,标题栏出现,但不显示 Unix 外观:

Unix skin - title bar visible but from different look and feel

请找到完整的代码(我试图使其尽可能简单,完整的工作代码):

package com.company;

import javax.swing.*;

public class Main {

public static void main(String[] args) {

NotepadWindow notepadWindow = new NotepadWindow();
}
}

class NotepadWindow extends JFrame {

public JTextArea textArea;

public NotepadWindow() {

super("Notepad - no name");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea = new JTextArea();
JScrollPane scroll = new JScrollPane(textArea);
getRootPane().add(scroll);

getRootPane().setJMenuBar(NotepadMenu.createMenuBar(this));

setVisible(true);
setSize(650, 550);
}
}

class NotepadMenu {

public static JMenuBar createMenuBar(NotepadWindow notepadWindow) {

ButtonGroup bg = new ButtonGroup();

JMenu skin = new JMenu("Skin");
JRadioButton winSkin = new JRadioButton("Windows Skin", true);
JRadioButton unixSkin = new JRadioButton("Unix Skin", false);

bg.add(winSkin);
bg.add(unixSkin);

winSkin.addActionListener(ie->{
NotepadLookAndFeelManager.setLookAndFeel(NotepadLookAndFeelManager.LookAndFeelTypes.WINDOWS, notepadWindow);
});

unixSkin.addActionListener(ae->{
NotepadLookAndFeelManager.setLookAndFeel(NotepadLookAndFeelManager.LookAndFeelTypes.UNIX, notepadWindow);
});

skin.add(winSkin);
skin.add(unixSkin);

JMenuBar menuBar = new JMenuBar();
menuBar.add(skin);
return menuBar;
}
}

class NotepadLookAndFeelManager {

public enum LookAndFeelTypes {
WINDOWS,
UNIX,
}

static void setLookAndFeel(LookAndFeelTypes lookAndFeelType, NotepadWindow notepadWindow) {

try {
switch (lookAndFeelType) {
case WINDOWS: //SWITCH TO WINDOWS WORKS FINE
notepadWindow.dispose();
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(notepadWindow.getRootPane());
notepadWindow.setUndecorated(false);
notepadWindow.setVisible(true);
break;

case UNIX: //SWITCH DOESN't WORK - TITLE BAR FROM DIFFERENT LAF
notepadWindow.dispose();
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
notepadWindow.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
SwingUtilities.updateComponentTreeUI(notepadWindow.getRootPane());
JFrame.setDefaultLookAndFeelDecorated(true);

notepadWindow.setUndecorated(true);
notepadWindow.setVisible(true);
break;
}

} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}

最佳答案

由于没有更好的答案,让我分享我的调查结果。

macOS 不支持 Unix(“motif”)外观,因此 Open JDK 13 已弃用它,并且不再建议使用:

https://bugs.openjdk.java.net/browse/JDK-8218637

关于java - SwingUtilities.updateComponentTreeUI() 不更改仅适用于 UNIX 皮肤的 JFrames 标题栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57557162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com