JavaFX-如何获取选项卡、按钮等的背景色
问题描述:我无法在JavaFX中获取对象的背景。我指的不是形状,而是按钮、选项卡等普通节点。我不知道如何使用他们的背景色 我想要什么?我正在开发IDE,我想在选项卡上运行彩色动画,其中包含用户想要打开的文件,并且该文件已经存在于程序文件集合中。在做这个动画之前,我想阅读原始标签的背景颜色,并在动画结束时将该颜色返回到标签。此外,我还想返回JavaFX-如何获取选项卡、按钮等的背景色,java,animation,colors,javafx,background,Java,Animation,Colors,Javafx,Background,问题描述:我无法在JavaFX中获取对象的背景。我指的不是形状,而是按钮、选项卡等普通节点。我不知道如何使用他们的背景色 我想要什么?我正在开发IDE,我想在选项卡上运行彩色动画,其中包含用户想要打开的文件,并且该文件已经存在于程序文件集合中。在做这个动画之前,我想阅读原始标签的背景颜色,并在动画结束时将该颜色返回到标签。此外,我还想返回悬停和选定的属性,当我在动画中设置一些颜色时,这些属性将消失,并且永远不会返回。我在CSS文件中设置的所有颜色,我不想更改它 我的问题:如何以编程方式获取和设置
悬停
和选定的
属性,当我在动画中设置一些颜色时,这些属性将消失,并且永远不会返回。我在CSS文件中设置的所有颜色,我不想更改它
我的问题:如何以编程方式获取和设置节点颜色?或者,如何使用“保存原始属性”进行彩色动画,并在动画结束时恢复这些属性
一个简短的例子:
sample.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<TabPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="600.0" stylesheets="@style.css" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<tabs>
<Tab text="Sample tab 1">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
<Tab text="Sample tab 2">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
<Tab text="Sample tab 3">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
</tabs>
</TabPane>
据我所知,公共API无法确定当前用作
区域
(包括控件
)背景色的内容(除非您知道它是由内联样式设置的,在这种情况下,您可以解析getStyle()
的结果,或者通过调用setBackground(…)
)。但我看你没有理由想要这个;如果删除任何内联样式或background
属性,则颜色将恢复为css文件中定义的颜色
下面是一个简单的示例,其中背景颜色由线性渐变(通过内联样式)设置,该渐变随着任务的进行而滑动:
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.IntegerBinding;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ColoredTabDemo extends Application {
private int tabCount ;
@Override
public void start(Stage primaryStage) {
TabPane tabPane = new TabPane();
for (int i = 0; i < 4; i++) {
tabPane.getTabs().add(createTab());
}
Scene scene = new Scene(tabPane, 600, 400);
scene.getStylesheets().add("colored-tab-demo.css");
primaryStage.setScene(scene);
primaryStage.show();
}
private Tab createTab() {
Tab tab = new Tab("Tab "+(++tabCount));
Button button = new Button("Load file...");
button.setOnAction(e -> {
Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
// simulate loading:
for (int i=1; i <= 500; i++) {
updateProgress(i, 500);
Thread.sleep(20);
}
return null ;
}
};
IntegerBinding progressAsPercent = Bindings.createIntegerBinding(() ->
(int) (task.getProgress() * 100), task.progressProperty());
tab.styleProperty().bind(Bindings.format("-fx-background-color: "
+ "linear-gradient(to right, -fx-accent 0%%, -fx-accent %d%%, -fx-background %1$d%%, -fx-background 100%%);",
progressAsPercent));
button.setDisable(true);
task.setOnSucceeded(evt -> {
tab.styleProperty().unbind();
tab.setStyle("");
button.setDisable(false);
});
new Thread(task).start();
});
tab.setContent(new StackPane(button));
return tab ;
}
public static void main(String[] args) {
launch(args);
}
}
可以很容易地获取/设置按钮颜色 只需遵循Background->BackgroundFill->getFills()列表的第一个元素->getFill()中的方法,这将为该节点的背景提供绘制对象。 然后将其投射到颜色对象。 颜色对象的值以十六进制数列出,其最后6个十六进制数字等于该颜色的十六进制RGB。请参见下面代码示例的输出。 如果我用的话可能会更安全!等于(.)方法而不是!=用于颜色检查,但不管怎样它似乎工作正常 假设您有一个棋盘格图案,由编号为10 x 10的正方形组成,根据正方形的编号是奇数还是偶数,交替使用蓝色或橙色。 假设每个方块都是一个按钮,每当玩家点击其中一个方块时,它就会被重新涂成红色。 但是如果玩家再次点击同一个方块,它就会恢复到原来的颜色 对我有用
.....
.....
.....
// Declare click response :
playBoard[i][j].setOnAction(e ->
{
n = Integer.parseInt(((Button)e.getSource()).getText());
toggleColorButtonRed((Button)e.getSource(), n);
});
.....
.....
.....
private void toggleColorButtonRed(Button button, int n)
{
Color color = (Color)button.getBackground().getFills().get(0).getFill();
if (color != Color.RED)
button.setBackground(new Background(new BackgroundFill(
Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
else
{
System.out.println("You have clicked a " + color + " square !");
if (n % 2 == 0)
button.setBackground(new Background(new BackgroundFill(
Color.ORANGE, CornerRadii.EMPTY, Insets.EMPTY)));
else
button.setBackground(new Background(new BackgroundFill(
Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
}
}
OUTPUT WHEN A SQUARE IS CLICKED TWICE
=====================================
You have clicked a 0xff0000ff square !
据我所知,没有办法以编程方式检索CSS文件中定义的样式。但不清楚你为什么要这么做。您可以在希望样式不同时设置内联样式,然后将其删除(这样它将恢复为样式表样式);或者添加一个新的样式类并将其删除,或者设置一个CSS伪类并将其取消设置以还原为以前的样式。我认为有一种方法可以获得背景颜色(在我看来,从CSS文件加载颜色或以某种编程方式加载颜色并不重要)。Java如何知道显示什么颜色?我不认为Java会一次又一次地读取CSS文件。我认为在某个地方存储了有关该颜色的信息,但问题是我是否可以访问该信息以及如何访问该信息。如果颜色是在外部样式表(您自己的或默认的样式表)中定义的,则无法通过编程从公共API获取该信息。当然,控件本身(或者更准确地说,它的皮肤)保存着这些数据,但这些数据是不可公开访问的。不过,我真的不明白你为什么要这么做。是的!经过大约30分钟的测试,它对我真正的项目有效!真正非常重要的是
tab.setStyle(“”)代码>。对于每个将使用该代码的人,不要忘记使用空样式。所以也很遗憾,你不能用公共API阅读背景色…,但可能以后。谢谢man.PS:CSS文件不需要用查找来编写,它对我很有用。查找颜色-fx background
正是我所需要的。谢谢这有文件记录吗?我可以在中找到查找到的颜色,但没有关于-fx background
的具体内容。这是一种虚拟财产,可以在任何地方使用,还是只使用明确指定了此-fx background
的节点?@Pascal我知道获取此信息的唯一方法是从
.tab{
-fx-background-color: -fx-background;
-fx-background: pink ;
}
.tab:hover{
-fx-background: red;
}
.tab:selected{
-fx-background: yellow;
}
.....
.....
.....
// Declare click response :
playBoard[i][j].setOnAction(e ->
{
n = Integer.parseInt(((Button)e.getSource()).getText());
toggleColorButtonRed((Button)e.getSource(), n);
});
.....
.....
.....
private void toggleColorButtonRed(Button button, int n)
{
Color color = (Color)button.getBackground().getFills().get(0).getFill();
if (color != Color.RED)
button.setBackground(new Background(new BackgroundFill(
Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
else
{
System.out.println("You have clicked a " + color + " square !");
if (n % 2 == 0)
button.setBackground(new Background(new BackgroundFill(
Color.ORANGE, CornerRadii.EMPTY, Insets.EMPTY)));
else
button.setBackground(new Background(new BackgroundFill(
Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
}
}
OUTPUT WHEN A SQUARE IS CLICKED TWICE
=====================================
You have clicked a 0xff0000ff square !