2017-04-11 241 views
0

我目前正在编写一个名为Farkle的游戏。我想为每个代表骰子的矩形添加一个OnMouseClick事件。javafx rectangle onmouseclick event(fxml)

我的问题是矩形不能识别MouseEvent。我使用Scene Builder构建了我的GUI。这是我的FXML代码的摘录:

<Rectangle fx:id="recDice1" arcHeight="5.0" arcWidth="5.0" fill="WHITE" 
height="40.0" onMouseClicked="#recDice1_OnMouseClicked" stroke="BLACK" 
strokeType="INSIDE" width="40.0" GridPane.halignment="CENTER" 
GridPane.valignment="CENTER" /> 

的矩形处于GridPane和GridPane被下令在BorderPane的左侧。

这是我的Java代码的摘录:

@FXML private Rectangle recDice1; 
@FXML public void recDice1_OnMouseClicked(MouseEvent event){ 
    System.out.println("Funktioniert!"); 
} 

@Override 
public void start(Stage primaryStage) { 
    this.primaryStage = primaryStage; 
    this.primaryStage.setTitle("Farkle"); 

    initLayout(); 

} 

    public void initLayout(){ 
    try { 
     //Erstelle FXMLLoader 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource("../gui/FarkleGUI.fxml")); 
     loader.setController(new FarkleControl()); 
     rootLayout = (BorderPane) loader.load(); 



     //Lade Szene 
     Scene scene = new Scene(rootLayout); 
     primaryStage.setScene(scene); 
     primaryStage.setResizable(false); 

     //Setze Grösse der Stage (Somit entfallen Margins) 
     primaryStage.sizeToScene(); 

     //Zeige Szene 
     primaryStage.show(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 


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

进口:

package java2.farkle.mlz.control; 

import java.io.IOException; 

import javafx.application.Application; 

import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 

import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

就像我在一开始的矩形不承认的MouseEvent说。我尝试了与按钮相同,它工作正常。

+0

如果您正在使用Scenebuilder,可以假定您正在使用MVC创意。但是,在你的代码中你不是。您使用Scenebuilder更改的FXML文件具有您应该使用的控制器文件。在MVC中几乎所有情况下,你都不应该对Main文件做任何事情。您的@FXML代码应该位于与FXML文件关联的控制器中。 – Sedrick

回答

0

这里是你可以分析的东西。

主要:

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

/** 
* 
* @author blj0011 
*/ 
public class Farkle extends Application 
{ 

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

     Scene scene = new Scene(root); 

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

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

} 

FXML:

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.ColumnConstraints?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.layout.RowConstraints?> 
<?import javafx.scene.shape.Rectangle?> 

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="farkle.FXMLDocumentController"> 
    <children> 
     <Button fx:id="button" layoutX="128.0" layoutY="155.0" onAction="#handleOnButtonAction" text="Click Me!" /> 
     <GridPane layoutX="6.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <columnConstraints> 
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
     </columnConstraints> 
     <rowConstraints> 
      <RowConstraints minHeight="100.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
     </rowConstraints> 
     <children> 
      <Rectangle fx:id="recDice1" arcHeight="5.0" arcWidth="5.0" fill="DODGERBLUE" height="100.0" onMouseClicked="#handleOnMouseClicked" stroke="BLACK" strokeType="INSIDE" width="160.0" /> 
      <Rectangle fx:id="recDice2" arcHeight="5.0" arcWidth="5.0" fill="DODGERBLUE" height="100.0" onMouseClicked="#handleOnMouseClicked" stroke="BLACK" strokeType="INSIDE" width="160.0" GridPane.columnIndex="1" /> 
     </children> 
     </GridPane> 
    </children> 
</AnchorPane> 

控制器:

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.shape.Rectangle; 

/** 
* 
* @author blj0011 
*/ 
public class FXMLDocumentController implements Initializable 
{  
    @FXML 
    private void handleOnButtonAction(ActionEvent event) 
    { 
     System.out.println("You clicked button: " + ((Button)event.getSource()).getId()); 
    } 

    @FXML private void handleOnMouseClicked(MouseEvent event) 
    { 
     System.out.println("You clicked rectangle: " + ((Rectangle)event.getSource()).getId()); 
    } 

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

谢谢你的回答。我试过你的代码,但它不适合我。我不会使用FXML,因此我更容易编写GUI。 – Luca

+0

如果答案是解决您的问题,您应该选择它作为正确的答案。 – Sedrick