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!
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
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