2017-02-27 21 views
1

これはjavafxの私の最初のプログラムです。シーンビルダの助けを借りてAnchorPaneを作成しました。私がこれから欲しいのは、AncherPaneのどこのピクセルをクリックしてそのピクセルの座標点を表示するかということです。 これは、私は問題があなたのFXMLであなたのanchorPaneにあることを前提としていますコントローラクラスonAction = '#initialize'を解決すると、イベントハンドラがネームスペースにないか、スクリプトにエラーがあります

package application; 
import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.AnchorPane; 
public class AxisController implements Initializable{ 

    @FXML 
    private AnchorPane anchr; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     assert anchr != null : "fx:id=\"anchr\" was not injected: check your FXML file 'AxisFxml.fxml'."; 
     anchr.setOnMouseClicked(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent event) { 
       System.out.println(event.getX()); 
       System.out.println(event.getY()); 
      } 
     }); 
    } 
} 

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

<?import javafx.scene.layout.AnchorPane?> 


<AnchorPane fx:id="anchr" onMouseClicked="#initialize" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.AxisController"> 
    <!-- TODO Add Nodes --> 
</AnchorPane> 

エラーメッセージ

javafx.fxml.LoadException: Error resolving onAction='#initialize', either the event handler is not in the Namespace or there is an error in the script. 
/home/xyz/workspace/AxisExample/bin/application/AxisFxml.fxml:9 

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2597) 
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:103) 
at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:610) 
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:770) 
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 
at application.AxisMain.start(AxisMain.java:16) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) 
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) 
at java.lang.Thread.run(Thread.java:745) 

答えて

0

ここではいくつかの誤解があります。

"イベントハンドラー属性"に値として設定した名前(onMouseClickedなど)は、これらのイベントが発生したときに呼び出されるメソッドです。この場合、マウスがクリックされたときに実行したいコードが含まれていなければなりません。これらのメソッドでは、イベントハンドラを登録しないでください。 (これは、「アンカーペインがクリックされたときに、アンカーペインのイベントハンドラを登録する」ことを意味します。

この結果、イベントハンドラメソッドとしてのFXMLは、正しいイベントタイプの単一のパラメータを取る必要があります。 (イベントオブジェクトを必要としない場合はパラメータを取ることもできますが、一般的なシナリオです)

エラーは、イベントハンドラと宣言したメソッドがあるためです(initialize()、完全に異なる役割を持っています)、間違った署名があります:間違った数(およびタイプ)のパラメータが必要です。

第二に、いずれかのパラメータなしで宣言されてもよい、またはタイプURLResourceBundleのパラメータで宣言さinitialize()方法は、FXMLをロードするプロセスの間に呼び出されます。これは、@FXMLの注釈付きフィールドがすべて注入された後、UIのルートがFXMLLoader.load()の呼び出しから返される前に発生します。したがって、ここでは@FXMLの注釈付きフィールドにアクセスすることは安全です。これらは正しく初期化されています。

イベントハンドラを登録する方法は2通りあります。

いずれ

は、コントローラ内のメソッドを定義し、FXMLファイルで参照:

<AnchorPane fx:id="anchr" onMouseClicked="#handleClick" ... fx:controller="application.AxisController"> 
    <!-- TODO Add Nodes --> 
</AnchorPane> 

、次いで

public class AxisController implements Initializable{ 

    @FXML 
    private AnchorPane anchr; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     assert anchr != null : "fx:id=\"anchr\" was not injected: check your FXML file 'AxisFxml.fxml'."; 

    } 

    @FXML 
    private void handleClick(MouseEvent event) { 
     System.out.println(event.getX()); 
     System.out.println(event.getY()); 
    } 
} 

または:

onMouseClicked属性をFXMLファイルから削除し、initialize()メソッドでイベントハンドラを登録します。 (コントローラーはあなたのものとまったく同じです。)

+0

@gawaruCoderはい申し訳ありませんが、そのパラメーターはありませんでした。今修正されました。 –

+0

私は両方のケースを使用していると働いて..ありがとう – bSr

+0

D yaa私はパラメータを設定しました – bSr

0

であるあなたが割り当てられていますあなたのFXMLのclickイベントのためにanchorPaneに機能しますか?それをクリックするかのmouseOverされたときにこの機能を行うためにFXMLであなたのanchorPaneを伝えることができ

@FXML 
private void restartExited() { 
    exitedTransition(0, "circle", null, buttonCirc); 
} 

:あなたはあなたがどこ例えば、変数を初期化するかのように同じことを行うことによって、そのイベントのための機能を設定することができている場合たとえば、コントローラとFXMLで設定する必要はありません。

またはあなたの場合:

@FXML 
private void initialize() { 
    anchr.setOnMouseReleased(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      System.out.println(event.getX()); 
      System.out.println(event.getY()); 
     } 
    }); 
} 

またはあなたのFXMLでAnchorPane上のonClickへの参照を削除し、あなたの現在のコードを使用することができます。あなたは、ステージとステージにロードするFXMLを定義しているところ

EDIT

は私が求めることができ、これは、アプリケーションやFXML用のコントローラのためのあなたの段階の初期化子のですか?

関連する問題