java - 如何强制 JavaFX 应用程序中的所有按钮使用我的自定义皮肤?

标签 java javafx fxml fxmlloader

假设我为 Button 编写了一个新皮肤。
在 JavaFX 8 中,它可能如下所示:

import com.sun.javafx.scene.control.skin.ButtonSkin;

// This is quite dirty because of using non-stable api:
public class MyButtonSkin extends ButtonSkin {
    ...
}

然后我希望在我的应用程序中为 FXMLLoader 创建的每个按钮使用此皮肤。 (通过 <Button ...> fxml-element) 并且我不想更改 fxml 文件。

我的问题是:

在 JavaFX 8 中执行此操作的可能性有哪些?

可以使用一些 DI 框架来执行此操作吗?

JavaFX 9 怎么样?

<小时/>

其他代码示例:

这款皮肤推出了新的underkeypress按钮的伪类:

import com.sun.javafx.scene.control.skin.ButtonSkin;
import javafx.css.PseudoClass;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

public class MyButtonSkin extends ButtonSkin {
    private static final PseudoClass PSEUDO_CLASS_UNDERKEYPRESS = PseudoClass.getPseudoClass("underkeypress");

    public MyButtonSkin(Button button) {
        super(button);
        button.addEventFilter(KeyEvent.KEY_PRESSED,
                (event -> {
                    if (event.getCode() == KeyCode.SPACE) {
                        pseudoClassStateChanged(PSEUDO_CLASS_UNDERKEYPRESS, true);
                    }
                }));
        button.addEventFilter(KeyEvent.KEY_RELEASED,
                (event -> {
                    if (event.getCode() == KeyCode.SPACE) {
                        pseudoClassStateChanged(PSEUDO_CLASS_UNDERKEYPRESS, false);
                    }
                }));
    }
}

该伪类应该通过 CSS 使用,例如:

.button:underkeypress {
    -fx-base: red;
}

最佳答案

正如 @kleopatra 所说,将皮肤应用到场景中所有 Button 的最佳方法是使用 CSS 样式表。

.button {
    -fx-skin: "my.package.MyButtonSkin";
}

将此样式表应用于场景的根

Parent root = loader.load(); // load fxml
root.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
<小时/>

据我所知,JavaFX 9 中没有更简单的方法来实现这一点。唯一的区别是 ButtonSkin 已移至公共(public) API,请参阅 javafx.scene.control.skin.ButtonSkin .

关于java - 如何强制 JavaFX 应用程序中的所有按钮使用我的自定义皮肤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49730602/

相关文章:

java - 将文件夹添加到 jar 中

java - 如何使用逗号从我的数据库表的特定列中拆分值?

java - 在drawImage()之后 Canvas 是空白的

javafx - 使 JavaFX 窗口处于事件状态

javafx - fxml:如何处理 Controller 中的按钮操作?

javafx - fxml 给出的 url 未在 intellij 中注册资源错误

java - 无法使用类路径选项从 cmd 运行此程序

java - 获取一个 XML 文件和一个 XSL 文件并从中生成一个 HTML 字符串?

java - (JavaFX)(场景生成器) 如何使按钮在单击后出现?

javafx - 通过拖放(行)对 tableview 进行排序