使多个合成器 LookAndFeels 在 java swing 应用程序中同时共存

Making several synth LookAndFeels coexist at the same time in a java swing application

我正在使用合成器外观开发 java 摇摆应用程序。 每个可能的摆动组件都有样式

我必须更改整个应用程序的 LookAndFeel,为每个可能的 swing 组件重新定义不同的样式。

我现在正在开发一个在应用程序外部启动的沙箱。沙盒加载我的新样式集,而应用程序仍加载旧样式。目前没有问题

但是,我必须将它 'progressively' 集成到应用程序中。这意味着在同一个 java 应用程序中,一些 HMI 必须使用旧样式集,而一些必须使用新样式集

困难在于每组样式都定义了自动应用于相应组件的合成“区域”样式,我不知道如何处理对应于相同组件类型的多个区域样式

有人知道我该怎么做吗? 我看到在 swing 的 UIManager 中,可以更改 LookAndFeel,但它会更改整个应用程序

我在 Internet 上看到的唯一解决方法是在实例化组件之前更改 LookAndFeel,然后再将其更改回来,这看起来是一个糟糕的解决方案

提前致谢

Only workaround I saw on the internet was to change the LookAndFeel before instanciating a Component, then change it back, which looks like an awful solution

这是一个非常糟糕 x 10 倍的解决方案。

我是 material-ui-swing and with the material style, you need to work with this concept of different style, and this is the main focus that I had during my development with the library, also because at the same time we integrate the library in one of the famous swing application called JMars 的作者,我们需要尊重 UX 团队提供的设计系统。

举个例子,material-ui-swing给出两种类型的API:

  • 其中一个是 Material 主题系统以声明方式定义应用程序的主题,
  • 二是给下级API实现UI组件不同的风格

在你的情况下,我们需要material-ui-swing的二次方,也就是较低级别的API,我将添加一个示例,该示例也在报告中在线存储库位于 link, and the complete doc is available here

自定义的可能示例如下

public class ContainedButtonUI extends MaterialButtonUI {

    //The propriety order inside the method installUI is important
    //because some propriety should be override
    @Override
    public void installUI(JComponent c) {
        super.mouseHoverEnabled = false;
        super.installUI(c);
        super.mouseHoverEnabled = true;
        super.colorMouseHoverNormalButton = MaterialColors.PURPLE_500;
        super.background = MaterialColors.PURPLE_700;
        c.setBackground(super.background);

        if(super.mouseHoverEnabled){
            c.addMouseListener(
                    MaterialUIMovement.getMovement(c, this.colorMouseHoverNormalButton)
            );
        }
        //If you want use this style also for Default button
       // super.defaultBackground = MaterialColors.PURPLE_700;
        //super.colorMouseHoverDefaultButton = MaterialColors.PURPLE_500;
        super.borderEnabled = false;
    }

之后,为了保持所有应用架构的整洁,您可以添加以下 JButton 特化

/** @author https://github.com/vincenzopalazzo */
public class ContainedButton extends JButton {

  public ContainedButton() {}

  public ContainedButton(Icon icon) {
    super(icon);
  }

  public ContainedButton(String text) {
    super(text);
  }

  public ContainedButton(Action a) {
    super(a);
  }

  public ContainedButton(String text, Icon icon) {
    super(text, icon);
  }

  @Override
  protected void init(String text, Icon icon) {
    super.init(text, icon);
    // When you don't want anymore you just delete the 
    // following line
    setUI(new ContainedButtonUI());
  }

当然,也许这个库不能在你所有的组件样式上帮助你,但没有人说这个库不能在社区的帮助下发展。

可以找到组件的不完整描述here

谢谢大家的回答,很抱歉我在假期没有反应

我想我找到了一个解决方案,这不是我所要求的,但解决了我的问题:

我不会让几种LookAndFeels共存。 相反,我将在同一个 LookAndFeel 中加载所有样式,新旧样式,并对新旧组件使用不同的 setName() 对于区域样式(这是这里的问题),我将创建一个自定义 SynthStyleFactory,它将重定向到正确的区域样式

所有HMI迁移完成后,我将删除不再需要的旧样式和自定义工厂