2017-03-01 3 views
0

J'ai créé cette application de dessin dans IntelliJ, et j'ai essayé SceneBuilder pour la première fois. Le "sample.fxml" que j'ai créé dans le générateur de scènes ne se chargera pas dans ma classe principale, donc j'ai fait moi-même le canevas directement dans la classe principale elle-même. Qu'est-ce que je fais de mal avec le chargeur/fichier FXML?Connectez SceneBuilder à fxmlloader

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Group; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     try { 
//   FXMLLoader load = FXMLLoader.load(getClass().getResource("sample.fxml")); 
//   load.load(); 
      Group root = new Group(); 
      Controller controller = new Controller(); 
      primaryStage.setTitle("Paint app"); 
      primaryStage.setScene(new Scene(root,800,500)); 
      primaryStage.show(); 
      root.getChildren().add(controller.canvas); 

      /*METODER I PROGRAMMET */ 
      controller.drawCanvas(); 

     }catch (Exception e){ 
      System.out.println(e); 
      System.exit(0); 
     } 
    } 


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

package sample; 

import javafx.fxml.FXML; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.paint.Color; 

public class Controller { 
    Canvas canvas = new Canvas(800,500); 


    @FXML 
    public void drawCanvas(){ 

     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.setLineWidth(3); 
     gc.setStroke(Color.BLACK); 
     System.out.println("drawCanvas"); 

     try { 
      canvas.setOnMousePressed(event -> { 
       System.out.println("Mouse click"); 
       gc.beginPath(); 
       gc.lineTo(event.getSceneX(), event.getSceneY()); 
       gc.stroke(); 
      }); 

      canvas.setOnMouseDragged(event -> { 
       System.out.println("Mouse dragged"); 
       gc.lineTo(event.getSceneX(), event.getSceneY()); 
       gc.stroke(); 
      }); 
     }catch (Exception e){ 
      System.out.println(e); 
      System.exit(0); 
     } 

    } 
} 

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

<?import javafx.scene.canvas.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> 
    <center> 
     <Canvas id="canvas" fx:id="canvas" height="359.0" onMouseClicked="#drawCanvas" onMouseDragged="#drawCanvas" width="394.0" BorderPane.alignment="CENTER" /> 
    </center> 
</BorderPane> 

Pas beaucoup de documentation existe sur scenebuilder. Merci!

+0

Scenebuilder crée la nœuds dans le fichier fxml. Lorsque vous créez des nœuds dans le fichier fxml, pour accéder à ces nœuds dans votre contrôleur, vous devez utiliser '@FXML NodeType nodeID;' – Sedrick

+0

Je l'ai changé à ce que Sedricks post dit, et a obtenu cette erreur: "java.lang.NullPointerException: Enfants: nœud enfant est null: parent = Groupe @ 3d19656b [styleClass = root]" – byblix

Répondre

0

J'ai pris votre fxml et contrôleur et les a ajoutés à un projet que j'ai créé dans Netbeans et cela a fonctionné.

This is your problem:

Change:

Canvas canvas = new Canvas(800,500); 

à:

@FXML Canvas canvas; 

dans votre contrôleur

Sample.java

package sample; 

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

public class Sample extends Application 
{  
    @Override 
    public void start(Stage stage) throws Exception 
    { 
     Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));//You may need so make the s lowercase. 

     Scene scene = new Scene(root); 

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

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    { 
     launch(args); 
    } 

} 

Controller.java

package sample; 

import javafx.fxml.FXML; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.paint.Color; 

public class Controller { 

    @FXML Canvas canvas; 

    @FXML 
    public void drawCanvas(){ 

     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.setLineWidth(3); 
     gc.setStroke(Color.BLACK); 
     System.out.println("drawCanvas"); 

     try { 
      canvas.setOnMousePressed(event -> { 
       System.out.println("Mouse click"); 
       gc.beginPath(); 
       gc.lineTo(event.getSceneX(), event.getSceneY()); 
       gc.stroke(); 
      }); 

      canvas.setOnMouseDragged(event -> { 
       System.out.println("Mouse dragged"); 
       gc.lineTo(event.getSceneX(), event.getSceneY()); 
       gc.stroke(); 
      }); 
     }catch (Exception e){ 
      System.out.println(e); 
      System.exit(0); 
     } 

    } 
} 

Sample.fxml

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

<?import javafx.scene.canvas.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> 
    <center> 
     <Canvas id="canvas" fx:id="canvas" height="359.0" onMouseClicked="#drawCanvas" onMouseDragged="#drawCanvas" width="394.0" BorderPane.alignment="CENTER" /> 
    </center> 
</BorderPane> 
+0

J'ai eu cette erreur en faisant cela : "java.lang.NullPointerException: Enfants: le nœud enfant est null: parent = Groupe @ 3d19656b [styleClass = root]" – byblix

0

Pas vraiment pourquoi, mais j'ai essayé de changer quelques fois à cela, et elle a effectivement travaillé: Merci @Sedrick Jefferson


package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Group; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     try { 
      Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
      primaryStage.setTitle("Paint app"); 
      primaryStage.setScene(new Scene(root)); 
      primaryStage.show(); 

     }catch (Exception e){ 
      System.out.println(e); 
      System.exit(0); 
     } 
    } 


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

Mon sample.fxml est en majuscule. C'est probablement le problème. – Sedrick

+1

Peut-être, ne me souviens pas si je l'ai capitalisé. Mais merci quand même! – byblix