2017-05-23 3 views
0

Je suis nouveau sur JavaFX et je travaille actuellement sur une application JavaFXML. Ce que j'essaye de faire est de trouver un moyen de changer la feuille de style globale quand je clique sur un bouton. Mon code actuel est ce ..JavaFX Modification de la feuille de style globale à partir du contrôleur de document

Main.Java

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

    public class CssChange extends Application { 

    static FXMLDocumentController myControllerHandle; 

    @Override 
    public void start(Stage stage) throws Exception { 
    FXMLLoader loader = new 
    FXMLLoader(getClass().getResource("CssChange.fxml")); 
    Parent root = loader.load(); 

    myControllerHandle = (FXMLDocumentController)loader.getController(); 

    Scene scene = new Scene(root); 

    stage.setScene(scene); 
    stage.show(); 
} 

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

Controller.java

import java.io.IOException; 
    import java.net.URL; 
    import java.util.ResourceBundle; 
    import javafx.event.ActionEvent; 
    import javafx.fxml.FXML; 
    import javafx.fxml.FXMLLoader; 
    import javafx.fxml.Initializable; 
    import javafx.scene.Parent; 
    import javafx.scene.Scene; 
    import javafx.scene.control.Button; 
    import javafx.scene.control.Label; 
    import javafx.scene.layout.AnchorPane; 
    import javafx.scene.layout.Pane; 

    public class FXMLDocumentController implements Initializable { 

    @FXML 
    private Label label; 

@FXML 
private Button button; 

@FXML 
private void CssChange(ActionEvent event) throws IOException{ 
    Parent root; 
    root = (AnchorPane) FXMLLoader.load(getClass().getResource("CssChange.fxml")); 
    System.out.println("You clicked me!"); 
    label.setText("Hello World!"); 
    String css = CssChange.class.getResource("login2.css").toExternalForm(); 
    root.getStylesheets().clear(); 
    root.getStylesheets().add(css); 
    root.applyCss(); 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
}  

} 

FXML document

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

    <?import java.lang.*?> 
    <?import java.util.*?> 
    <?import javafx.scene.*?> 
    <?import javafx.scene.control.*?> 
    <?import javafx.scene.layout.*?> 
    <?import javafx.scene.text.Font?> 

    <AnchorPane prefHeight="800.0" prefWidth="480.0" 
     stylesheets="@Login.css" xmlns="http://javafx.com/javafx/8.0.111" 
     xmlns:fx="http://javafx.com/fxml/1" 
     fx:controller="csschange.FXMLDocumentController" fx:id="root"> 

<children> 
    <Button layoutX="14.0" layoutY="25.0" mnemonicParsing="false" 
     onAction="#CssChange" text="CSS Change" fx:id="button"> 
    <font> 
     <Font name="Arial Bold Italic" size="18.0" /> 
    </font> 
    </Button> 
    <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" 
     fx:id="label" /> 
    </children> 
    </AnchorPane > 

premier CSS

.root { 
    -fx-background-color: 
    linear-gradient(#000000 0%, #ffffff 100%); 
    } 

    .label { 
    -fx-font-size: 12px; 
    -fx-font-weight: bold; 
    -fx-text-fill: #333333; 
    -fx-effect: dropshadow(gaussian , rgba(255,255,255,0.5) , 0,0,0,1); 
    } 

deuxième CSS

.root { 
    -fx-background-image: url("background.jpg"); 
    } 

    .label { 
    -fx-font-size: 12px; 
    -fx-font-weight: bold; 
    -fx-text-fill: #ffffff; 
    -fx-effect: dropshadow(gaussian , rgba(255,255,255,0.5) , 0,0,0,1); 
    } 

Le code semble fonctionner bien et quand je clique sur le bouton je ne reçois pas d'erreur, mais, rien ne se passe. Le second CSS ne semble pas du tout appelé. J'apprécierais vraiment toute aide que je pourrais obtenir. Merci d'avance.

Répondre

0

Avez-vous essayé de masquer puis d'afficher la scène (ou le volet racine)? Peut-être actualiser l'affichage changerait quelque chose ...

+0

Nous avons essayé de cacher, puis montrant chaque volet. Il s'est avéré être un simple manque d'un tag @FXML. – Kailee