2012-06-04 10 views
9

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

admin_category_label.getStyleClass().remove(admin_category_label.getStyleClass().indexOf("selected")); 
admin_category_label.getStyleClass().add("clear"); 

लेकिन शैली वर्ग के रूप में ही चयनित रहेगी

+0

कुछ जावाएफएक्स संस्करणों में स्टाइल क्लास प्रबंधन के आसपास कुछ बग थे। [देर से डेवलपर पूर्वावलोकन] में अपने परीक्षण का पुनः प्रयास करें (http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html) और देखें कि क्या आपको अभी भी समस्याएं हैं या नहीं। – jewelsea

उत्तर

15

यह एक बग है। यह यहां बताया गया है Removal of hovered style class, does not update styling। आप वोट देना और देखना चाहते हैं। एक वर्कअराउंड के रूप में आपको सीएसएस नियमों को ओवरराइड करना चाहिए जिन्हें आपने छुआ/बदल दिया है, जो डिफ़ॉल्ट रूप से समान हैं। डेमो:

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBoxBuilder; 
import javafx.stage.Stage; 

public class StyleDemo extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final Label lbl = new Label("Style Me"); 
     lbl.getStyleClass().add("style1"); // initial style 

     Button btn = new Button("Change the style"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent arg0) { 
       lbl.getStyleClass().remove("style1"); 
       lbl.getStyleClass().add("style2"); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(VBoxBuilder.create().spacing(20).children(lbl, btn).build()); 
     Scene scene = new Scene(root, 300, 250); 
     scene.getStylesheets().add(this.getClass().getResource("style.css").toExternalForm()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

और style.css है:

.style1 { 
    -fx-text-fill: red; 
    -fx-border-color: green; 
    -fx-font-size: 20; 
} 

.style2 { 
    -fx-text-fill: blue; 
    -fx-border-color: red; 
    -fx-font-size: 15; 
    -fx-underline: true; 
} 

जब बटन शुरू में जोड़ा style1 निकाल दिया जाता है और क्लिक किया जाता है style2 जोड़ा जाता है।

+0

यह सबसे अच्छा समाधान नहीं है क्योंकि मुझे उन्हें बदलने के लिए सभी नियमों को फिर से लिखना है, वे स्वचालित रूप से डिफ़ॉल्ट या अन्य कक्षा में रीसेट नहीं होंगे। लेकिन यह काम करता है। धन्यवाद –

+0

नहीं, आपको फिर से लिखना नहीं है। क्योंकि शैली चयनकर्ताओं को क्रम में एक के बाद एक लागू किया जाता है। उदाहरण के लिए यदि मैंने style1 को हटा दिया है और बटन क्लिक पर style2 को जोड़ा नहीं है, तो लेबल अंतर्निहित caspian.css में परिभाषित अपनी डिफ़ॉल्ट शैली के साथ रहता है। –

+0

मेरी पिछली टिप्पणी भूल जाओ। अब मैं तुम्हारा मतलब बताता हूं। –

0

आप के लिए एक सीएसएस जोड़ने की कोशिश कर सकते हैं इसके बजाए आवेदन आप अपने आवेदन के तर्क से डिज़ाइन को अलग करने के लिए भी FXML का उपयोग कर सकते हैं। यहां कोड का एक टुकड़ा है जो जावाएफएक्स 2.1 में मेरे लिए काम करता है!

private Parent replaceSceneContent(String fxml) throws Exception { 
    Parent page = (Parent) 
     FXMLLoader.load(
     Main.class.getResource(fxml), null, new JavaFXBuilderFactory()); 
    Scene scene = stage.getScene(); 
    if (scene == null) { 
     scene = new Scene(page, 1366, 720); 
     scene.getStylesheets().add(
     Main.class.getResource(
      "../skinFolder/css/defaultSkin.css").toExternalForm()); 
     stage.setScene(scene); 
    } else { 
     stage.getScene().setRoot(page); 
    } 
    stage.sizeToScene(); 
    return page; 
} 
1

उलुक बिया द्वारा पोस्ट किए गए समाधान के लिए धन्यवाद। लेकिन ऐसा लगता है कि "जैसा है" (जेडीके 1.70_40 जीत x 64 पर परीक्षण) नहीं है। मुझे सेटिंग्स वर्ग से पहले स्टाइल क्लास को साफ़ करना होगा। यहां मेरे लिए कामकाजी कोड:

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBoxBuilder; 
import javafx.stage.Stage; 

public class StyleDemo extends Application { 
    //ADD just a toggle property 
    public static BooleanProperty toggle = new SimpleBooleanProperty(false); 

    @Override 
    public void start(Stage primaryStage) { 
     final Label lbl = new Label("Style Me"); 
     lbl.getStyleClass().add("style1"); // initial style 

     Button btn = new Button("Change the style"); 

     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       //ADD clear style class ! 
       lbl.getStyleClass().clear(); 
       if(toggle.get()) { 
        lbl.getStyleClass().add("style1"); 
        toggle.set(!toggle.get()); 
       }else{ 
        lbl.getStyleClass().add("style2"); 
        toggle.set(!toggle.get()); 
       } 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(VBoxBuilder.create().spacing(20).children(lbl,btn).build()); 
     Scene scene = new Scene(root, 300, 250); 
     scene.getStylesheets().add("/style.css"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
1

कम से कम जावा 8 के लिए, यह अब काम करता है। लेकिन ओपी के काम करने के बजाए, मैं इसे इस तरह प्राप्त करूंगा:

admin_category_label.getStyleClass().remove("selected"); 
admin_category_label.getStyleClass().add("clear"); 

थोड़ा क्लीनर दिखता है।

याद रखें, जो आपके CSS चयनकर्ताओं का इस तरह देखने की जरूरत है:,

.selected { 
    /* Styling attributes... */ 
} 

.clear { 
    /* Styling attributes... */ 
} 
0

6 साल laters बग अभी भी वहाँ है, यहाँ से जाने के लिए एक सरल तरीका है विशेष रूप से यदि आप के साथ गड़बड़ करने के लिए चाहते नहीं होगा अन्य वर्ग:

int indexOf = textField.getStyleClass().indexOf(INVALID_CLASS); 
if(indexOf != -1){ 
    textField.getStyleClass().remove(indexOf); 
} 

यह क्यों काम करता है? चूंकि स्टाइल क्लास के लिए उपयोग की जाने वाली सूची जो एक ट्रैक करने योग्य ऑब्सर्बब्लीलिस्ट को पदानुक्रम से प्राप्त होती है जहां निकालें (अनुक्रमणिका) आग में परिवर्तन करता है जहां निकालें (ऑब्जेक्ट) नहीं होता है।

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