简体   繁体   English

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

[英]JavaFX - how to get background color of Tab, Button, etc

Problem description: I can't get background of object in JavaFX. 问题描述:我无法在JavaFX中获得对象的背景。 I don't mean Shapes, but normal Nodes like Buttons, Tabs and others. 我不是指形状,而是像Buttons,Tabs等常规节点。 I don't know how to access to theirs background color. 我不知道如何访问他们的背景颜色。

What I want? 我想要的是? I am developing IDE and I want to run Color animation on tab with file that user want to open and is already existing in program file collection. 我正在开发IDE,我想在选项卡上运行Color动画,文件是用户想要打开的,并且已经存在于程序文件集合中。 Before doing this animation I want to read original tab background color and that color is returned to tab at the end of animation. 在做这个动画之前,我想阅读原始标签背景颜色,并在动画结束时将颜色返回到标签。 Also I want to get back hover and selected properties, which disappear when I set some color in animation and they never get back. 此外,我想回到hoverselected属性,当我在动画中设置一些颜色并且它们永远不会回来时它会消失。 All colors I am setting up in CSS file and I don't want to change it. 我在CSS文件中设置的所有颜色,我不想更改它。

My question: How to get and set programmatically Node color? 我的问题:如何以编程方式获取和设置节点颜色? Or how to do color animation with save original properties and at the end of animation get this properties back? 或者如何使用保存原始属性进行颜色动画,并在动画结束时获取此属性?

One short example: 一个简短的例子:

一个简短的例子

sample.fxml 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 styles.css的

.tab{
-fx-background-color:   pink;}

.tab:hover{
-fx-background-color:   red;}

.tab:selected{
-fx-background-color:   yellow;}

As far as I know, there is no way in the public API to determine what is being currently used as the background color for a Region (including for a Control ) (unless you know it is either set by an inline style, in which case you can parse the result of getStyle() or by a call to setBackground(...) ). 据我所知,公共API中没有办法确定当前用作Region (包括Control )的背景颜色(除非你知道它是由内联样式设置的,在这种情况下)你可以解析getStyle()的结果或通过调用setBackground(...)来解析。 But I see no reason you would want this; 但我认为没理由你会想要这个; the color will revert to that defined in the css file if you remove any inline styles or background property. 如果删除任何内联样式或background属性,颜色将恢复为css文件中定义的颜色。

Here's a simple example where the background color is set by a linear gradient (via an inline style) which slides as a task progresses: 这是一个简单的示例,其中背景颜色由线性渐变(通过内联样式)设置,随着任务的进行滑动:

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 is almost exactly the same as you posted, but using a looked-up color instead of setting -fx-background-color directly: 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;
}

Can get/set Button color easy enough. 可以轻松获取/设置按钮颜色。

Just follow the methods from Background -> BackgroundFill -> first element of getFills() list -> getFill() -- which gives you the Paint object for this node's background. 只需按照Background - > BackgroundFill中的方法 - > getFills()list的第一个元素 - > getFill() - 它为您提供此节点背景的Paint对象。 Then just cast this to a Color object. 然后将其转换为Color对象。 The value of the Color object is listed as a hex number whose last 6 hex digits equate to the hex RGB for that color. Color对象的值列为十六进制数,其最后6个十六进制数字等于该颜色的十六进制RGB。 See output of code example below. 请参阅下面的代码示例输出。 It might be safer if I'd used the !equals(.) method rather than != for color checking but it seems to work fine anyway. 如果我使用!equals(。)方法而不是!=进行颜色检查可能会更安全,但无论如何它似乎工作正常。

Say you have a checkerboard pattern of numbered 10 x 10 squares alternately colored blue or orange depending on whether the square's number is odd or even respectively. 假设您有一个编号为10 x 10的方格棋盘图案,交替显示蓝色或橙色,具体取决于方块的数字是奇数还是偶数。 Say each square is a Button and whenever a player clicks on one of them, it is re-colored red. 假设每个方格都是一个按钮,每当玩家点击其中一个时,它就会重新着色为红色。 But if the player clicks again on the same square, it is restored to its original color. 但是如果玩家再次点击同一个方块,它将恢复到原来的颜色。

Works for me. 适合我。

.....
.....
.....

// 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 !

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM