如何在 java swing gui 应用程序中实现深色和浅色模式?

问题描述 投票:0回答:2

我对编码相当陌生,我正在开发一个桌面应用程序,我想在其中实现深色和浅色模式。问题是我想在两者之间来回切换,在主类中,我有一个类的实例化,如果我通过并且添加一个切换到暗/亮模式的操作,它代表我的应用程序的主视图它只影响弹出窗口,因为该函数是在主视图实例化之后调用的,如果我在实例化之前调用该函数,则具有相同的效果。我尝试了各种解决方案,但我无法弄清楚。如果有人有想法,请提前致谢。这是代码。

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;
    }
}
java swing look-and-feel
2个回答
1
投票

很高兴在此部分添加更多内容;对于像 Swing 这样的非常古老的框架来说,这看起来像是一个现代问题。

但是,Java Swing 有机会支持这一更改。有像 FlatLafmaterial-ui-swing 这样的库可以在您的应用程序中实现不同的样式。

我是 material-ui-swing 的作者,所以我会描述它。特别是,因为它像 Flutter 或 Compose 等现代框架一样实现了 Material Theme 的概念(自 2019 年起)。

事实上,您可以将自定义主题实现为 Jar,并将其包含在外部库中,示例可以是 DarkStackOverflowTheme

要在您的应用程序上支持深色模式和浅色模式,您基本上可以使用 UI Manager 在

MaterialUISwing(dark or light theme)
中切换材质主题。

你的问题是一个通用问题,但我做了一些演示,其中还包括JMenuBar中主题的切换,你可以看一下DemoSwingRatio


0
投票

使用系统外观,您应该会自动获得它。

try {
    // Set System L&F
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (UnsupportedLookAndFeelException e) {
    // handle exception
}
© www.soinside.com 2019 - 2024. All rights reserved.