提问人:rado_rud 提问时间:11/15/2023 最后编辑:rado_rud 更新时间:11/15/2023 访问量:72
javafx event.getSource() 未按预期工作
javafx event.getSource() not working as expected
问:
我想寻求有关event.getSource()的帮助。我已经开始学习 JavaFx,互联网上的所有教学视频都说这样做,请参阅基本代码。 但是,event.getSource() 生成的输出只是对 button(Button@4454de36[styleClass=button]'Write') 的引用,因此显然没有与 if 语句中的字符串进行比较。因此,btn 点击什么也做不了。什么是工作解决方案?
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.StackPane;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
public class HelloWorld extends Application implements EventHandler<ActionEvent> {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
Button btn = new Button("Write");
btn.setOnAction(this);
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene sc = new Scene(root, 200, 100);
primaryStage.setScene(sc);
primaryStage.show();
}
@Override
public void handle(ActionEvent event){
System.out.println(event.getSource());
if(event.getSource() == "btn"){
System.out.println("Hello World");
}
}
}
我尝试使用event.getSource()。以某种方式分离按钮的名称,但没有任何效果。输出仍然相同。
答:
3赞
jewelsea
11/15/2023
#1
视频中的代码之所以有效,是因为它不是将事件源与 String 进行比较,而是将其与按钮进行比较。
无论如何,这种方法是次优的,不要编写这样的代码,在其中实现开关或测试以在事件处理程序中查找源。
您正在按钮上设置事件处理程序,因此您已经知道事件处理程序应用于哪个按钮 - >您不需要测试来查找应用了哪个按钮,也不需要对所有按钮使用一个事件处理程序。
相反,为每个按钮创建一个新的事件处理程序。这可以使用 lambda 表达式轻松完成:
button.setOnAction(e -> doSomething());
其中 是执行操作时要执行的某个方法的名称。doSomething()
Eden 教程解释了如何处理按钮事件:
Eden 文章中的示例代码(略有修改):
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ButtonEventExampleApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
//Create Scene Graph
Button button = new Button("Press me!");
StackPane root = new StackPane(button);
Scene scene = new Scene(root, 300, 250);
//Define Button Action
Label label = new Label("Pressed!");
button.setOnAction(event ->
root.getChildren().setAll(label)
);
//Create Window
primaryStage.setTitle("Button Example App");
primaryStage.setScene(scene);
primaryStage.show();
}
}
评论
0赞
rado_rud
11/15/2023
谢谢你的链接,我将专注于这些教程。我是这个领域的初学者,所以欢迎所有有价值的信息。
评论
String
Application