使多个合成器 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迁移完成后,我将删除不再需要的旧样式和自定义工厂
我正在使用合成器外观开发 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迁移完成后,我将删除不再需要的旧样式和自定义工厂