Ich programmiere gerade ein Spiel namens Farkle. Ich möchte für jedes Rechteck, das einen Würfel darstellt, ein OnMouseClick-Ereignis hinzufügen.javafx rechteck onmouseclick event (fxml)
Mein Problem ist, dass das Rechteck das MouseEvent nicht erkennt. Ich habe meine GUI mit dem Szenengenerator erstellt. Dies ist ein Auszug meines FXML Code:
<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" />
Das Rechteck ist in einem GridPane und die GridPane ist auf der linken Seite eines BorderPane bestellt.
Und dies ist der Auszug aus meinem Java-Code:
@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);
}
Importe:
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;
Wie ich am Anfang sagte das Rechteck nicht das Mouseevent nicht erkennt. Ich habe das gleiche mit einem Button versucht und es hat gut funktioniert.
Wenn Sie Scenebuilder verwenden, kann davon ausgegangen werden, dass Sie MVC-Ideen verwenden. Doch in deinem Code bist du nicht. Die FXML-Datei, die Sie mit Scenebuilder geändert haben, enthält eine Controller-Datei, mit der Sie arbeiten sollten. In MVC sollte man in fast allen Fällen nichts zur Main-Datei machen. Ihr @FXML-Code sollte sich in dem Controller befinden, der der FXML-Datei zugeordnet ist. – Sedrick