2015-06-15 38 views
2

问题描述:我无法获得JavaFX中对象的背景。我不是指形状,而是正常的节点,如按钮,标签和其他。我不知道如何访问他们的背景颜色。JavaFX - 如何获取Tab,Button等的背景颜色

我想要什么?我正在开发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;} 
+0

有没有办法(我知道)以编程方式检索定义在CSS文件中的样式。但目前还不清楚为什么你需要。您可以设置内联样式,但希望样式不同,然后将其删除(以便它将恢复为样式表样式);或者添加一个新的样式类并将其删除,或者设置一个CSS伪类并将其取消设置以恢复到之前的样式。 –

+0

我想有如何获得背景颜色(国际海事组织无关紧要的颜色从CSS文件加载或以某种方式编程)。如何Java知道显示什么颜色?我不这么认为,Java一次又一次地读取CSS文件。我认为某处是关于存储这种颜色的infomarion,但问题是如果我有权访问该信息以及如何访问。 –

+0

如果颜色是在外部样式表中定义的(无论是您自己的还是默认样式),那么无法通过公共API以编程方式获取该信息。当然,控制本身(或更确切地说,它的皮肤)拥有这些数据,但它们不是公众可以访问的。但是,我真的不明白你为什么想要。 –

回答

3

据我所知,在公共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); 
    } 
} 

有色制表demo.css是几乎完全一样的如您发布,但使用查到的颜色,而不是直接设置-fx-background-color

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

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

.tab:selected{ 
    -fx-background: yellow; 
} 
+0

是的!经过大约30分钟的测试后,它适用于我的真实项目!真正非常重要的是'tab.setStyle(“”);'。对于使用该代码的每个人,不要忘记为空样式。所以也很遗憾你不能使用公共API读取背景颜色......但也许以后。谢谢你,兄弟。 –

+0

PS:CSS文件不需要用查找来编写,它对我有用。 –

2

能找到按钮颜色很容易。

只需按照背景 - >背景填充 - > getFills()list - > getFill()的第一个元素的方法,该方法为您提供此节点背景的Paint对象。 然后,只需将其转换为Color对象。

假设您有一个棋盘格式的编号为10 x 10的方块,交替地用蓝色或橙色代替,这取决于方块的编号是奇数还是偶数。 说每个方块都是一个Button,每当玩家点击其中一个时,它就会重新涂成红色。 但是,如果玩家再次点击同一方格,它会恢复到原来的颜色。

适合我。

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

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