2017-03-01 28 views
0

我在IntelliJ中制作了这个短绘图应用程序,并且我第一次尝试了SceneBuilder。我在场景构建器中制作的“sample.fxml”不会加载到我的Main-class中,所以我直接在Main-class本身制作了Canvas等。 我在做什么错误的FXML加载器/文件?将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> 

没有太多的文档存在于scenebuilder。 谢谢!

+0

Scenebuilder创建fxml文件中的节点。当您在fxml文件中创建节点时,要访问控制器中的这些节点,应该使用'@FXML NodeType nodeID' – Sedrick

+0

我改变它塞德里克斯发布说,并得到这个错误: “java.lang.NullPointerException:子节点:子节点为空:父=组@ 3d19656b [styleClass = root]” – byblix

回答

0

我把你的fxml和控制器,并将它们添加到我在Netbeans中创建的项目,它的工作。

This is your problem:

变化:

Canvas canvas = new Canvas(800,500); 

到:

在控制器
@FXML Canvas canvas; 

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

我得到这个错误只是通过这样做: “java.lang.NullPointerException:子节点:子节点为null:parent = Group @ 3d19656b [styleClass = root]” – byblix

0

真的不知道为什么,但我试图几次更改此,它实际工作:谢谢@Sedrick杰斐逊


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

我的sample.fxml是大写。这可能是问题所在。 – Sedrick

+1

也许,不记得我是否大写了它。但是,无论如何谢谢你! – byblix