我一直在尝试创建一个简单的程序,该程序创建单个按钮的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");
}
}
}
答案 0 :(得分:2)
错误是字段myButton
从未设置。当ButtonHandler.handle()
被调用时,myButton
被null
引起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);
}
}