Button javafx将多个按钮连接到同一个处理程序
我试着做一个简单的计算器,有20个按钮和一个处理器。在java中,我可以在ActionPerformed中使用带有event.getSource()的“if”语句来检查按下了哪个按钮,但它不适用于javafx中的处理程序。在javafx中,是否所有按钮都有一个处理程序?(我不想使用Java8Lambdas。) 上次我尝试使用setId/getId,但它(对我)不起作用Button javafx将多个按钮连接到同一个处理程序,button,javafx,handler,Button,Javafx,Handler,我试着做一个简单的计算器,有20个按钮和一个处理器。在java中,我可以在ActionPerformed中使用带有event.getSource()的“if”语句来检查按下了哪个按钮,但它不适用于javafx中的处理程序。在javafx中,是否所有按钮都有一个处理程序?(我不想使用Java8Lambdas。) 上次我尝试使用setId/getId,但它(对我)不起作用 公共类计算器扩展应用程序{ 公共按钮b0、b1; @凌驾 公共无效开始(阶段primaryStage){ GridPane gr
公共类计算器扩展应用程序{
公共按钮b0、b1;
@凌驾
公共无效开始(阶段primaryStage){
GridPane grid=新建GridPane();
b0=新按钮(“0”);
b0.setId(“0”);
b0.setMaxSize(Double.MAX_值,Double.MAX_值);
加(b0,0,1);
b0.设定动作(myHandler);
b1=新按钮(“1”);
b1.setId(“1”);
b1.setMaxSize(Double.MAX_值,Double.MAX_值);
加上(b1,0,0);
b1.设定动作(myHandler);
场景=新场景(网格,365,300);
scene.getStylesheets().add
(Calculator.class.getResource(“Calculator.css”).toExternalForm());
初级阶段。场景(场景);
primaryStage.SetResizeable(假);
primaryStage.show();
}
final EventHandler myHandler=新的EventHandler(){
@凌驾
公共无效句柄(最终操作事件){
按钮x=(按钮)事件。getSource();
如果(x.getId().equals(b0.getId()))
系统输出打印项次(“0”);
else如果(x.getId().equals(b1.getId()))
系统输出打印项次(“1”);
}
};
公共静态void main(字符串[]args){
发射(args);
}
}我测试了您的代码,它似乎工作得很好 不过,没有真正的理由测试按钮的ID。如果您真的想使用相同的处理程序(我不建议这样做),只需测试每个按钮和事件源之间的相等性:
final EventHandler<ActionEvent> myHandler = new EventHandler<ActionEvent>(){
@Override
public void handle(final ActionEvent event) {
if (event.getSource() == b0)
System.out.println("0");
else if(event.getSource() == b1)
System.out.println("1");
}
};
当我尝试时,您的代码运行得很好(尽管有更简单的方法)。不过,对于不同的控件使用不同的处理程序通常要好得多;你为什么要这样做?哦!真正地我不想把所有的代码都粘贴到这里,只想在这里写下精华。真有趣。谢谢你的回复!我认为如果我使用一个处理程序,代码会更干净,我不知道这个缺点。对于较短的代码,可以使用Lambda表达式,如
b0.setOnAction(e->System.out.println(“b0按下”)
Thanx,这非常有帮助!
final EventHandler<ActionEvent> myHandler = new EventHandler<ActionEvent>(){
@Override
public void handle(final ActionEvent event) {
if (event.getSource() == b0)
System.out.println("0");
else if(event.getSource() == b1)
System.out.println("1");
}
};
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;
public class Calculator extends Application {
private final IntegerProperty value = new SimpleIntegerProperty();
class NumberButtonHandler implements EventHandler<ActionEvent> {
private final int number ;
NumberButtonHandler(int number) {
this.number = number ;
}
@Override
public void handle(ActionEvent event) {
value.set(value.get() * 10 + number);
}
}
@Override
public void start(Stage primaryStage) {
GridPane grid = createGrid();
for (int n = 1; n<10; n++) {
Button button = createNumberButton(n);
int row = (n-1) / 3;
int col = (n-1) % 3 ;
grid.add(button, col, 2 - row);
}
Button zeroButton = createNumberButton(0);
grid.add(zeroButton, 1, 3);
Button clearButton = createButton("C");
// without lambdas:
// clearButton.setOnAction(
// new EventHandler<ActionEvent>() {
// @Override
// public void handle(ActionEvent event) {
// value.set(0);
// }
// }
// );
// with lambdas:
clearButton.setOnAction(event -> value.set(0));
grid.add(clearButton, 2, 3);
TextField displayField = createDisplayField();
BorderPane root = new BorderPane();
root.setPadding(new Insets(10));
root.setTop(displayField);
root.setCenter(grid);
Scene scene = new Scene(root, 365, 300);
primaryStage.setScene(scene);
primaryStage.setResizable(false);
primaryStage.show();
}
private Button createNumberButton(int number) {
Button button = createButton(Integer.toString(number));
button.setOnAction(new NumberButtonHandler(number));
return button ;
}
private Button createButton(String text) {
Button button = new Button(text);
button.setMaxSize(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
GridPane.setFillHeight(button, true);
GridPane.setFillWidth(button, true);
GridPane.setHgrow(button, Priority.ALWAYS);
GridPane.setVgrow(button, Priority.ALWAYS);
return button ;
}
private GridPane createGrid() {
GridPane grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(5);
grid.setVgap(5);
grid.setPadding(new Insets(10));
return grid;
}
private TextField createDisplayField() {
TextField displayField = new TextField();
displayField.textProperty().bind(Bindings.format("%d", value));
displayField.setEditable(false);
displayField.setAlignment(Pos.CENTER_RIGHT);
return displayField;
}
public static void main(String[] args) {
launch(args);
}
}