2012-10-25 12 views
13

मैं इस कोड के साथ एक सरल दृश्य है:JavaFX 2 और सीएसएस छद्म कक्षाएं: मंडराना स्थापित करने setStyle विधि में जिम्मेदार बताते हैं

scene.getStylesheets().add("packagename/testcss.css"); 

और मेरे testcss.css है:

.button { 
    -fx-background-color: #DDFFA4; 
} 

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

मैं क्या हासिल वेब अनुप्रयोगों में जब उर्फ ​​होवर अच्छा प्रभाव है।

enter image description here ... enter image description here

प्रश्न
मैं कैसे एक ही प्रभाव है, लेकिन एक अलग सीएसएस फ़ाइल के बिना, बस अपना बटन के setStyle विधि के माध्यम से प्राप्त कर सकते हैं?
समस्या यह है कि सेट स्टाइल केवल स्टाइल परिभाषा स्वीकार करता है और चयनकर्ता को छोड़ देता है।

.button:hover 

लेकिन जहां मैं इसे सेट करना चाहिए:

button.setStyle("-fx-background-color: #DDFFA4;"); 

चयनकर्ता, मेरी मंडराना मामले में छद्म वर्ग है?

ध्यान दें कि, एचटीएमएल शैली विशेषता की तरह, इस चर शैली गुणों और मूल्यों और की नहीं चयनकर्ता भाग शामिल हैं:

इसके अलावा, जावाडोक setStyle विधि तर्क से चयनकर्ता को छोड़कर में स्पष्ट है एक शैली नियम।

उत्तर

26

जैसा कि आप जावाफैक्स 2.2 के रूप में अपने प्रश्न में नोट करते हैं, सीएसएस छद्मक्लास को सार्वजनिक एपीआई के हिस्से के रूप में उजागर नहीं किया जाता है जिसका उपयोग आप जावा कोड के अंदर स्टाइल मैनिपुलेशन के लिए कर सकते हैं।

यदि आप स्टाइलशीट का उपयोग किये बिना जावा कोड से शैली विशेषताओं को बदलना चाहते हैं, तो आपको ईवेंट या चेंजलिस्टिस्टर्स के आधार पर शैलियों को सेट करने की आवश्यकता है। नीचे नमूने में कुछ विकल्प हैं।

import javafx.application.Application; 
import javafx.beans.binding.*; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.*; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

/** Changing button styles on hover without a css stylesheet. */ 
public class ButtonBackgroundChanger extends Application { 
    private static final String STANDARD_BUTTON_STYLE = "-fx-background-color: #DDFFA4;"; 
    private static final String HOVERED_BUTTON_STYLE = "-fx-background-color: #9ACD32;"; 

    public static void main(String[] args) throws Exception { launch(args); } 
    @Override public void start(final Stage stage) throws Exception { 
    Button configure = new Button("Configure"); 
    changeBackgroundOnHoverUsingBinding(configure); 
    Button update = new Button("Update"); 
    changeBackgroundOnHoverUsingEvents(update); 

    VBox layout = new VBox(10); 
    layout.setAlignment(Pos.CENTER); 
    layout.setStyle("-fx-padding: 10;"); 
    layout.getChildren().addAll(configure, update); 
    stage.setScene(new Scene(layout)); 
    stage.show(); 
    } 

    private void changeBackgroundOnHoverUsingBinding(Node node) { 
    node.styleProperty().bind(
     Bindings 
     .when(node.hoverProperty()) 
      .then(
      new SimpleStringProperty(HOVERED_BUTTON_STYLE) 
     ) 
      .otherwise(
      new SimpleStringProperty(STANDARD_BUTTON_STYLE) 
     ) 
    ); 
    } 

    public void changeBackgroundOnHoverUsingEvents(final Node node) { 
    node.setStyle(STANDARD_BUTTON_STYLE); 
    node.setOnMouseEntered(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
     node.setStyle(HOVERED_BUTTON_STYLE); 
     } 
    }); 
    node.setOnMouseExited(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
     node.setStyle(STANDARD_BUTTON_STYLE); 
     } 
    }); 
    }  
} 

मैं केवल वास्तव में यह एक स्टाइलशीट कोड के बजाय में क्या करता है, तो रंग पूर्वनिर्धारित रंग और शैलियों के साथ स्टाइलशीट का वास्तव में गतिशील बनाने उपयोग समस्याग्रस्त, या अगर कोई सीएसएस स्टाइलशीट का उपयोग करने के कुछ अन्य घृणा था होने की जरूरत होगी।

जावाएफएक्स 8 में एक सार्वजनिक एपीआई है जो आपको (यदि आप चाहते हैं) manipulate Region background colors without use of CSS पर अनुमति देती है। दोनों अभिनव (बंधन आधार पर) के साथ जवाब की पूर्णता और पारंपरिक (घटना आधारित) समाधान के लिए

sample program output

+0

+1:

नमूना कार्यक्रम निर्गम (अद्यतन बटन के साथ hovered)। समूह में बदलाव का तथ्य भी दिलचस्प है बैकग्राउंडऑनहोवर यूजिंग मानक शैली के लिए इवेंट सेटिंग और प्रारंभिक दोनों घटनाएं, इस तरह हमारे पास विजेट के लिए कॉन्फ़िगरेशन का एक बिंदु है, अंतर्निहित संशोधनों के जोखिम को कम करता है, और उस घटना-आधारित समाधान को हाइलाइट करने के अतिरिक्त चरण की आवश्यकता होती है प्रारंभ। इस तरह की विधि को "initButtonStyle" जैसे कुछ नामों के साथ प्रारंभिक के रूप में भी देखा जा सकता है। – AgostinoX

+0

हैलो यहूदीया, आपने बताया कि जावाएफएक्स 8 कुछ संशोधनों की अनुमति देता है। क्या हमारे पास एक लिंक या उदाहरण हो सकता है :)।क्योंकि सवाल वास्तव में पुराना है और इस भाग में थोड़ा सा अपडेट चाहिए। – GOXR3PLUS

+0

जावाएफएक्स 8 पृष्ठभूमि एपीआई के लिंक के लिए अद्यतन उत्तर। – jewelsea

संबंधित मुद्दे