我对编码相当陌生,我正在开发一个桌面应用程序,我想在其中实现深色和浅色模式。问题是我想在两者之间来回切换,在主类中,我有一个类的实例化,如果我通过并且添加一个切换到暗/亮模式的操作,它代表我的应用程序的主视图它只影响弹出窗口,因为该函数是在主视图实例化之后调用的,如果我在实例化之前调用该函数,则具有相同的效果。我尝试了各种解决方案,但我无法弄清楚。如果有人有想法,请提前致谢。这是代码。
import view.MainFrame;
public class Main {
public static void main(String[] args) {
MainFrame mainFrame = MainFrame.getInstance();
}
}
import controller.ActionManager;
import lombok.Getter;
import lombok.Setter;
import javax.swing.*;
import java.awt.*;
@Getter
@Setter
public class MainFrame extends JFrame {
private static MainFrame instance = null;
private MenuBar RuMenuBar;
private ToolBar toolBar;
private ActionManager actionManager;
private MainFrame(){ }
private void initialiseActionManager() {
actionManager = new ActionManager();
}
private void initialiseGUI() {
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension sc = tk.getScreenSize();
int height = sc.height;
int width = sc.width;
setSize(width, height);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setTitle("Dokru");
RuMenuBar = new MenuBar();
setJMenuBar(RuMenuBar);
toolBar = new ToolBar();
add(toolBar,BorderLayout.NORTH);
JPanel treePanel = new JPanel();
// JScrollPane scrollPane = new JScrollPane(treePanel); todo scroll
JPanel workspacePanel = new JPanel();
JSplitPane splitPane = new
JSplitPane(JSplitPane.HORIZONTAL_SPLIT,treePanel,workspacePanel);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(300);
getContentPane().add(splitPane, BorderLayout.CENTER);
setLocationRelativeTo(null);
setVisible(true);
}
public static MainFrame getInstance() {
if(instance == null) {
instance = new MainFrame();
instance.initialiseActionManager();
instance.initialiseGUI();
}
return instance;
}
}
很高兴在此部分添加更多内容;对于像 Swing 这样的非常古老的框架来说,这看起来像是一个现代问题。
但是,Java Swing 有机会支持这一更改。有像 FlatLaf 或 material-ui-swing 这样的库可以在您的应用程序中实现不同的样式。
我是 material-ui-swing 的作者,所以我会描述它。特别是,因为它像 Flutter 或 Compose 等现代框架一样实现了 Material Theme 的概念(自 2019 年起)。
事实上,您可以将自定义主题实现为 Jar,并将其包含在外部库中,示例可以是 DarkStackOverflowTheme。
要在您的应用程序上支持深色模式和浅色模式,您基本上可以使用 UI Manager 在
MaterialUISwing(dark or light theme)
中切换材质主题。
你的问题是一个通用问题,但我做了一些演示,其中还包括JMenuBar中主题的切换,你可以看一下DemoSwingRatio。
使用系统外观,您应该会自动获得它。
try {
// Set System L&F
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (UnsupportedLookAndFeelException e) {
// handle exception
}