JavaFX - 如何获取Tab,Button等的背景颜色

时间:2015-06-15 17:58:44

标签: java animation colors javafx background

问题描述:我无法获得JavaFX中的对象背景。我不是指形状,而是像Buttons,Tabs等常规节点。我不知道如何访问他们的背景颜色。

我想要什么?我正在开发IDE,我想在选项卡上运行Color动画,其中包含用户想要打开的文件并且已存在于程序文件集合中。在做这个动画之前,我想阅读原始标签背景颜色,并在动画结束时将颜色返回到标签。此外,我想回到hoverselected属性,当我在动画中设置一些颜色并且它们永远不会回来时,这些属性会消失。我在CSS文件中设置的所有颜色,我都不想更改它。

我的问题:如何以编程方式获取和设置节点颜色?或者如何使用保存原始属性进行颜色动画,并在动画结束时获取此属性?

一个简短的例子:

One short example

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;}

2 个答案:

答案 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);
}