2014-01-27 1 views
1

개체를 양식화하는 CSS 개체가 있습니다. 내 프로그램에서는 배경색과 같은 스타일의 특정 요소를 변경하고 싶습니다. 내가 겪었던 문제는 setStyle (-fx-background-color : red)을 호출 할 때 모든 스타일 요소를 덮어 씁니다. 배경색을 바꾸더라도.CSS와 setStyle을 모두 사용합니다.

#header { 
-fx-background-color: #4d4d4d; 
-fx-border-color: #545454; 
-fx-border-width: 1px; 
-fx-border-style: solid; 
} 
#header:hover { 
-fx-background-color: #9ACD32; 
} 
+0

한 가지 방법은 정확히 스타일이 될 것입니다 무슨의 스타일로 키와 값이 해시 맵에 CSS를 구문 분석했다. 그런 다음 해시 맵을 반복하고 큰 문자열을 만들고 setStyle을 호출합니다. –

+0

스타일 클래스를 추가하고 그런 식으로 액세스 해 보았습니까? ... Node.getStyleClass(). add ("hover_node")'그런 다음 CSS에서 '.hover_node {-fx-background-color : # 9ACD32; }'그게 효과가 있을지 모르겠다. – WillBD

답변

9

"look up colors"를 사용하여 CSS에서 색상을 정의해야합니다.

자세한 내용은 JavaFX CSS reference을 참조하십시오.

보았다 업 색상 현재 노드 또는 부모의에 설정되어 다른 색상 속성을 참조 할 수 있습니다 보았다 업 색상

. 이것은 매우 강력한 기능입니다. 일반 색상 팔레트를 장면에 지정하고 응용 프로그램을 사용하는 방식으로 사용할 수 있습니다. 팔레트 색상 중 하나를 변경하려면 장면 트리의 모든 레벨에서 변경할 수 있으며 해당 노드와 그 모든 종속 항목에 영향을 미칩니다. 룩업 된 색상은 적용될 때까지 조회되지 않으므로 실시간으로 팔레트 색상을 노드의 "스타일"속성으로 바꾸는 것과 같이 발생할 수있는 스타일 변경 사항에 활발하고 반응합니다.

다음 예제에서 모든 단추의 배경색은 모두 룩업 된 색 "abc"를 사용합니다.

.root { abc: #f00 } 
.button { -fx-background-color: abc } 

샘플 애플리케이션

샘플 애플리케이션에서는

background-setting

, 키 코드는 코드를 동적으로 고개 색상 값의 설정이다

headerColorToggleGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>() { 
    @Override 
    public void changed(
     ObservableValue<? extends Toggle> observableValue, 
     Toggle oldToggle, 
     Toggle newToggle 
    ) { 
     RadioButton radio = (RadioButton) newToggle; 
     header.setStyle("header-base-color: " + radio.getText()); 
    } 
}); 

header-base-color의 정의와 함께 아래 CSS의 컬러 룩업 ID :

헤더 color.css

.root { 
    header-base-color: #4d4d4d; 
} 

#header { 
    -fx-background-color: header-base-color; 
    -fx-border-color: #545454; 
    -fx-border-width: 1px; 
    -fx-border-style: solid; 
} 

#header:hover { 
    -fx-background-color: #9ACD32; 
} 

헤더 color.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?scenebuilder-stylesheet header-color.css?> 

<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.layout.VBox?> 
<?import java.net.URL?> 

<BorderPane id="BorderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="-1.0" prefWidth="-1.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="HeaderColorController"> 
    <top> 
    <HBox fx:id="header" prefHeight="-1.0" prefWidth="-1.0"> 
     <children> 
     <Label text="A really hard to read label" /> 
     </children> 
    </HBox> 
    </top> 
    <center> 
    <VBox prefHeight="-1.0" prefWidth="-1.0" spacing="10.0" style="-fx-background-color: azure;"> 
     <children> 
     <RadioButton mnemonicParsing="false" style="-fx-text-fill: forestgreen;" text="forestgreen"> 
      <toggleGroup> 
      <ToggleGroup fx:id="headerColorToggleGroup" /> 
      </toggleGroup> 
     </RadioButton> 
     <RadioButton mnemonicParsing="false" style="-fx-text-fill: firebrick;" text="firebrick" toggleGroup="$headerColorToggleGroup" /> 
     <RadioButton mnemonicParsing="false" selected="true" style="-fx-text-fill: #4d4d4d;" text="#4d4d4d" toggleGroup="$headerColorToggleGroup" /> 
     </children> 
     <padding> 
     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
     </padding> 
    </VBox> 
    </center> 
    <stylesheets> 
    <URL value="@header-color.css" /> 
    </stylesheets> 
</BorderPane> 

HeaderColorApp.java

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class HeaderColorApp extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     Parent root = FXMLLoader.load(getClass().getResource("header-color.fxml")); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { launch(args); } 
} 
나는 생각했다

HeaderColorController.java

import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.beans.value.*; 
import javafx.fxml.FXML; 
import javafx.scene.control.*; 
import javafx.scene.layout.HBox; 

public class HeaderColorController { 

    @FXML 
    private ResourceBundle resources; 

    @FXML 
    private URL location; 

    @FXML 
    private HBox header; 

    @FXML 
    private ToggleGroup headerColorToggleGroup; 

    @FXML 
    void initialize() { 
     assert header != null : "fx:id=\"header\" was not injected: check your FXML file 'header-color.fxml'."; 
     assert headerColorToggleGroup != null : "fx:id=\"headerColorToggleGroup\" was not injected: check your FXML file 'header-color.fxml'."; 

     headerColorToggleGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>() { 
      @Override 
      public void changed(ObservableValue<? extends Toggle> observableValue, Toggle oldToggle, Toggle newToggle) { 
       RadioButton radio = (RadioButton) newToggle; 
       header.setStyle("header-base-color: " + radio.getText()); 
      } 
     }); 
    }  
} 
관련 문제