2017-03-01 12 views
0

JavaFXを初めて使用しています。チュートリアルにしたがってシーンを生成し、イベントハンドラをボタンに関連づけようとしています。JavaFX:LoadExceptionボタンのイベントハンドラのonActionを解決します。

私はMain.FXMLを作成し、SceneBuilderで編集しました。 IDEにSceneBuilderのパスを追加したので、メインコントローラを検出することができます。私は乱数を生成する関数を書いた。

public class MainController { 

    public static void generateRandom(ActionEvent event) { 
     Random rand = new Random(); 
     int myrand = rand.nextInt(500) + 1; 
     System.out.print(Integer.toString(myrand)); 
    } 
} 

シーンビルダでは、コントローラのこのメソッドを検出します。このメソッドは、ボタンのOnActionのイベントハンドラとして簡単に追加できます。 Main.FXMLは操作後に更新されます。

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.AnchorPane?> 


<AnchorPane prefHeight="300" prefWidth="500" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="application.MainController"> 
    <children> 
     <Button layoutX="204.0" layoutY="204.0" mnemonicParsing="false" onAction="#generateRandom" text="Button" /> 
     <Label layoutX="138.0" layoutY="36.0" prefHeight="144.0" prefWidth="210.0" /> 
    </children> 
</AnchorPane> 

私のメインアプリケーションクラスは以下の通りである:私はアプリを実行すると

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) throws IOException { 
     Parent root = FXMLLoader.load(getClass().getResource("/application/Main.fxml")); 
     Scene scene = new Scene(root,400,400); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
     primaryStage.setTitle("My Title"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 

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

、私はエラーを得た:

javafx.fxml.LoadException: Error resolving onAction='#generateRandom', either the event handler is not in the Namespace or there is an error in the script. /C:/Users/Oscar/Workspace/Sunoco/bin/application/Main.fxml:10

Error resolving “onAction” while loading FXMLは、それがために間違ってインポートを行う必要があり示唆しますActionEventはそうではありません。さらに、SceneBuilderとEclipseを使用してすべてが自動的にセットアップされます。では、なぜこのエラーが出るのですか?

答えて

2

eventMethodに@FXMLアノテーションを使用すると問題は解決すると思います。また、コントローラ内でメソッドを静的にしないでください。混乱したり誤解を招く恐れがあります。そのメソッドが他の場所からアクセスできるようにする必要がある場合は、それを別の(ユーティリティのような)クラスで宣言することを検討してください。

+0

「静的」のように見えますが問題が発生しています。取り出した後、 '@ FXML'アノテーションなしで動作しました。 – ddd

関連する問題