问题描述:我无法获得JavaFX中的对象背景。我不是指形状,而是像Buttons,Tabs等常规节点。我不知道如何访问他们的背景颜色。
我想要什么?我正在开发IDE,我想在选项卡上运行Color动画,其中包含用户想要打开的文件并且已存在于程序文件集合中。在做这个动画之前,我想阅读原始标签背景颜色,并在动画结束时将颜色返回到标签。此外,我想回到hover
和selected
属性,当我在动画中设置一些颜色并且它们永远不会回来时,这些属性会消失。我在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>
styles.css的
.tab{
-fx-background-color: pink;}
.tab:hover{
-fx-background-color: red;}
.tab:selected{
-fx-background-color: yellow;}
答案 0 :(得分:4)
据我所知,公共API无法确定当前用作Region
的背景颜色(包括Control
)(除非你知道它)可以通过内联样式设置,在这种情况下,您可以解析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);
}
}
colored-tab-demo.css与您发布的几乎完全相同,但是使用查找颜色而不是直接设置-fx-background-color
:
.tab{
-fx-background-color: -fx-background;
-fx-background: pink ;
}
.tab:hover{
-fx-background: red;
}
.tab:selected{
-fx-background: yellow;
}
答案 1 :(得分:3)
可以轻松获取/设置按钮颜色。
只需按照背景中的方法 - &gt; BackgroundFill - &gt; getFills()列表的第一个元素 - &gt; getFill() - 它为您提供此节点背景的Paint对象。 然后将其转换为Color对象。 Color对象的值列为十六进制数,其最后6个十六进制数等于该颜色的十六进制RGB。请参阅下面的代码示例输出。 如果我使用!equals(。)方法而不是!=进行颜色检查可能会更安全,但无论如何它似乎工作正常。
假设您有一个编号为10 x 10的方格棋盘图案,交替显示蓝色或橙色,具体取决于方形的数字是奇数还是偶数。 假设每个方格都是一个按钮,每当玩家点击其中一个时,它就会重新着色为红色。 但是如果玩家再次点击同一个方格,它将恢复到原来的颜色。
适合我。
template <typename T, std::size_t Size>
struct Array {
T data[Size];
template <typename ...Args>
constexpr Array(const Args&... args) : data{args...} {
}
};
int main() {
Array<int, 2> c(42, -18);
assert(c.data[0] == 42);
assert(c.data[1] == -18);
constexpr Array<int, 2> cc(42, -18);
static_assert(cc.data[0] == 42);
static_assert(cc.data[1] == -18);
}