假设我为 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/