2015-06-15 2 views
2

Описание проблемы: Я не могу получить фон объекта в JavaFX. Я не имею в виду фигуры, но обычные узлы, такие как кнопки, вкладки и другие. Я не знаю, как получить доступ к их цвету фона.JavaFX - как получить цвет фона Tab, Button и т. Д.

Что я хочу? Я разрабатываю IDE, и я хочу запустить цветную анимацию на вкладке с файлом, который пользователь хочет открыть и уже существует в коллекции файлов программы. Перед выполнением этой анимации я хочу прочитать исходный цвет фона вкладки, и этот цвет возвращается на вкладку в конце анимации. Также я хочу вернуть hover и selected свойства, которые исчезают, когда я устанавливаю некоторый цвет в анимации, и они никогда не возвращаются. Все цвета, которые я настраиваю в файле 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

Я полагаю, что есть способ получить цвет фона (IMO. Не имеет значения, что этот цвет загружается из файла CSS или каким-то образом программным образом). Как Java знает, какой цвет отображать? Я не думаю, что Java читает файл CSS снова и снова. Я думаю, что где-то есть информация об этом сохраненном цвете, но вопрос в том, есть ли у меня доступ к этой информации и как. –

+0

Если цвет определен во внешней таблице стилей (либо вашей собственной, либо стандартной по умолчанию), тогда нет никакого способа получить эту информацию программным путем из общедоступного API. Конечно, сам контроль (или, точнее, его Кожа) содержит эти данные, но они недоступны для общественности. Но опять же, я действительно не понимаю, зачем вам это нужно. –

ответ

3

Насколько я знаю, в публичном API нет способа определить, что в настоящее время используется в качестве цвета фона для Region (в том числе для Control) (если вы не знаете, что он либо установлен встроенным стилем, в в этом случае вы можете проанализировать результат getStyle() или по телефону setBackground(...)). Но я не вижу причин, по которым вы захотите этого; цвет вернется к тому, что определено в файле css, если вы удалите любые встроенные стили или свойство background.

Вот простой пример, в котором цвет фона задается линейным градиентом (через встроенный стиль), который скользит, как задача прогрессирует:

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

может найти кнопки цвета достаточно легко.

Просто следуйте методам из фона -> BackgroundFill -> первый элемент списка getFills() -> getFill() - который дает вам объект Paint для фона этого узла. Затем просто отбросьте это на объект «Цвет».

Скажите, что у вас есть шаблон шахматной доски пронумерованных 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 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))); 
} 
Смежные вопросы