如何返回按下的按钮的值

时间:2015-12-04 18:30:23

标签: java loops javafx eventhandler

嗨,我知道这应该是基础知识,但我真的很困难 我想返回单击按钮的int vaue并关闭对话框

public static int showButtonDialog(String title, String label, String[] button)
{
    ArrayList<Button> buttons = new ArrayList<>();
    Stage dialog = new Stage();

    boolean value = false;
    GridPane pain = new GridPane();
    Scene layer = new Scene(pain);
    dialog.setScene(layer);
    dialog.initModality(Modality.APPLICATION_MODAL);
    dialog.setTitle(title);
    pain.add(new Label(label), 0, 0);

    for (int i = 0; i < button.length; i++)
    {
        final int finalI = i;

        buttons.add(new Button(button[i].toString()));
        pain.add((buttons.get(i)), i, 1);

        buttons.get(i).setOnAction(new EventHandler<ActionEvent>()
        {

            @Override
            public void handle(ActionEvent event)
            {
                changeint(finalI);
                change(value);
                dialog.close();
            }

        });

    }
    dialog.showAndWait();
    if (value)
    {
        return temp;
    }
    else
    {
        return -1;
    }
}

但是如何让方法句柄返回一个int作为覆盖方法。

2 个答案:

答案 0 :(得分:0)

2件事:

- 你需要创建一个可变变量i的最终副本,以便在你的代码中引用它

final int finalI = i;
buttons.get(i).setOnAction(new EventHandler<ActionEvent>()
... the rest of your code...

- 正如James_D所指出的那样,你不能从handle()返回一个值,因为它返回void。您可能希望使用值来调用类的方法:

...(inside your event handler)...
doButtonClickAction(finalI);
祝你好运!

答案 1 :(得分:0)

您需要在按钮处理程序方法中设置一个值,并从showButtonDialog方法返回该值。由于您正在调用showAndWait(),执行将在该点停止,这将允许在方法返回之前设置该值。

这里唯一棘手的部分是你不能在lambda表达式中修改局部变量,所以你需要创建一个包装类来保存值。最简单的方法是本地内部类:

public static int showButtonDialog(String title, String label, String[] button)
{
    ArrayList<Button> buttons = new ArrayList<>();
    Stage dialog = new Stage();

    boolean value = false;
    GridPane pain = new GridPane();
    Scene layer = new Scene(pain);
    dialog.setScene(layer);
    dialog.initModality(Modality.APPLICATION_MODAL);
    dialog.setTitle(title);
    pain.add(new Label(label), 0, 0);

    class ValueHolder { int value ; }
    ValueHolder valueHolder = new ValueHolder();
    valueHolder.value = -1 ;

    for (int i = 0; i < button.length; i++)
    {
        final int finalI = i;

        buttons.add(new Button(button[i].toString()));
        pain.add((buttons.get(i)), i, 1);

        buttons.get(i).setOnAction(new EventHandler<ActionEvent>()
        {

            @Override
            public void handle(ActionEvent event)
            {
                valueHolder.value = finalI ;
                dialog.close();
            }

        });

    }
    dialog.showAndWait();
    return valueHolder.value ;
}

请注意,您实际上正在复制Alert类的一些功能:使用该类而不是创建自己的对话框可能更好。