提问者:小点点

javafx矩形onmuseclick事件(fxml)


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

我的问题是矩形无法识别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" />

矩形在网格窗格中,网格窗格在边框窗格的左侧排序。

这是我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;

就像我在开始时所说的,矩形无法识别鼠标事件。我用按钮尝试了同样的方法,它工作得很好。


共1个答案

匿名用户

这里有一些你可以分析的东西。

主要:

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