Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX-如何获取选项卡、按钮等的背景色_Java_Animation_Colors_Javafx_Background - Fatal编程技术网

JavaFX-如何获取选项卡、按钮等的背景色

JavaFX-如何获取选项卡、按钮等的背景色,java,animation,colors,javafx,background,Java,Animation,Colors,Javafx,Background,问题描述:我无法在JavaFX中获取对象的背景。我指的不是形状,而是按钮、选项卡等普通节点。我不知道如何使用他们的背景色 我想要什么?我正在开发IDE,我想在选项卡上运行彩色动画,其中包含用户想要打开的文件,并且该文件已经存在于程序文件集合中。在做这个动画之前,我想阅读原始标签的背景颜色,并在动画结束时将该颜色返回到标签。此外,我还想返回悬停和选定的属性,当我在动画中设置一些颜色时,这些属性将消失,并且永远不会返回。我在CSS文件中设置的所有颜色,我不想更改它 我的问题:如何以编程方式获取和设置

问题描述:我无法在JavaFX中获取对象的背景。我指的不是形状,而是按钮、选项卡等普通节点。我不知道如何使用他们的背景色

我想要什么?我正在开发IDE,我想在选项卡上运行彩色动画,其中包含用户想要打开的文件,并且该文件已经存在于程序文件集合中。在做这个动画之前,我想阅读原始标签的背景颜色,并在动画结束时将该颜色返回到标签。此外,我还想返回
悬停
选定的
属性,当我在动画中设置一些颜色时,这些属性将消失,并且永远不会返回。我在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 !