gpt4 book ai didi

java - 将皮肤应用于所有 JavaFX 子控件

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

我正在使用两个自定义皮肤实现一些 JavaFX 控件。我有一些基本控件,每个控件都有两个不同的皮肤,以及一个将其中两个组合在一起的控件。我现在想知道当我想以相同的方式为两个嵌入式控件设置皮肤时,如何实现复合控件的皮肤,即复合控件应该有两个皮肤,并且当我应用其中一个嵌入式控件时应该也被剥皮。基本上,我想在控制图上递归应用皮肤。

class Control1 extends Control {}
class Control1Skin1 extends SkinBase<Control1> {}
class Control1Skin2 extends SkinBase<Control1> {}

class Control2 extends Control {}
class Control2Skin1 extends SkinBase<Control1> {}
class Control2Skin2 extends SkinBase<Control1> {}

class CompositeControl extend Control {
private final Control1 ctrl1 = new Control1();
private final Control2 ctrl2 = new Control2();
}

class CompositeControlSkin1 extends SkinBase<Control1> {}
class CompositeControlSkin2 extends SkinBase<Control1> {}
  1. 使控件成为皮肤的成员。这会导致代码重复并将逻辑移至不属于该皮肤的皮肤中。
  2. CompositeControl添加访问器以访问嵌入式控件。这会破坏封装。
  3. 将成员包设置为私有(private),以便皮肤可以访问它们并适本地设置皮肤。封装上有一个小漏洞,但皮肤和控制类无论如何都形成了一个有凝聚力的集群。
  4. 定义一个自定义 CompositeControlSkin 接口(interface),其中包含返回子控件外观的方法。然后,我必须重写 CompositeControl.setSkin(Skin Skin)skin` 参数转换到新界面中,获取皮肤并设置它们。这需要像 3 中一样访问成员,但还需要向下转换。我认为这不符合该方法的资格。

我想知道 JavaFX 中是否有更好的方法,例如复合表皮。我发现的有关自定义可换肤控件的文档有点稀疏,因此我将不胜感激任何链接或提示。

最佳答案

首先,请确保您确实需要额外的皮肤。仅当您希望控件的外观和行为与默认控件完全不同时才需要外观。通常,使用 CSS 设计应用程序的样式就足够了。

如果您得出结论确实需要其他皮肤,请检查以下步骤:

  1. 每个可换肤的自定义控件都应该有一个特定的样式类

:

private static final String DEFAULT_STYLE_CLASS = "my-control";

[...]

public MyControl(){
getStyleClass().setAll(DEFAULT_STYLE_CLASS);
}
  • 识别实际上需要额外皮肤的控件。这可能不适用于您的所有控件(例如,可能不需要复合控件的附加外观)

  • 覆盖您想要在自定义 CSS 中使用的外观:

  • :

    .my-control { 
    -fx-skin: "somepackage.skin.MyControlSkin2";
    }

    请注意,如果您确实想要一个高度可定制和高度可重用的控件,则只需扩展 Control 并提供皮肤即可。

    对于应用程序开发人员来说,大多数时候您可以使用 fx:root FXML 构造创建可重用的控件。例如。您的复合控件可能适合此用途。

    自定义可换肤控件通常不包含其他控件,因为这将控件与特定的外观和感觉联系在一起。如果您想要可换肤的复合控件,则嵌套控件应位于外观中,而不是控件中。

    关于java - 将皮肤应用于所有 JavaFX 子控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169861/

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