Java GUI事件处理程序

时间:2018-08-13 16:43:17

标签: java

我一直在尝试创建一个简单的程序,该程序创建单个按钮的GUI,该按钮链接到事件处理程序。程序应在单击时将按钮的文本更改为“已单击”。但是,我得到一个例外。有人知道我的代码有什么问题吗?

import javafx.application.*;
import javafx.scene.*;
import javafx.stage.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.geometry.*;
import javafx.event.*;

public class test extends Application 
{
private Button myButton;

    public void start(Stage myStage)
    {
        myStage.setTitle("Changing Button Text");

        FlowPane rootNode = new FlowPane(Orientation.VERTICAL);
        rootNode.setAlignment(Pos.CENTER);
        Scene myScene = new Scene (rootNode, 400 , 300);

        Button myButton = new Button("test");

        rootNode.getChildren().addAll(myButton);
        myButton.setOnAction(new ButtonHandler());


        myStage.setScene(myScene);
        myStage.show();


    }

    class ButtonHandler implements EventHandler<ActionEvent>
    {
        public void handle(ActionEvent e)
        {

            myButton.setText("Clicked");
        }
    }



}

2 个答案:

答案 0 :(得分:2)

错误是字段myButton从未设置。当ButtonHandler.handle()被调用时,myButtonnull引起NullPointerException被抛出。在这一行:

Button myButton = new Button("test");

您创建一个掩盖它的局部变量。将行更改为此:

myButton = new Button("test");

它将起作用。

答案 1 :(得分:-1)

摆脱buttonHandler方法,并使用它,因为它是在javafx中实现事件处理的最简单方法。 编辑:现在我已经更新了可以完全满足您需求的代码

import javafx.application.Application;
import javafx.scene.*;
import javafx.stage.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.geometry.*;
import javafx.event.*;


public class Main extends Application {

 public void start(Stage primaryStage){  

 FlowPane rootNode = new FlowPane(Orientation.VERTICAL);
 rootNode.setAlignment(Pos.CENTER);
 Scene myScene = new Scene (rootNode, 400 , 300);

 Button myButton = new Button("test");
 myButton.setOnAction(e -> myButton.setText("Clicked"));

 rootNode.getChildren().addAll(myButton);

primaryStage.setTitle("something");
primaryStage.setScene(myScene);
primaryStage.show();

}

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