【问题标题】:How can i return the value of the Button which was pressed如何返回被按下的按钮的值
【发布时间】:2015-12-04 18:30:23
【问题描述】:

嗨,我知道这应该是基础知识,但我真的卡住了 我想返回被点击的按钮的 int 值并关闭对话框

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 它是一个覆盖方法。

【问题讨论】:

  • 你不能。 handle 方法是 void。无论如何,您会在哪里收到返回值?
  • @James_D 对,handle() 方法无效
  • 但是如何实现返回按钮的值我点击了一个如此简单的问题我已经尝试在内部匿名类中编写另一个方法但他只启动不返回任何东西的句柄.. . 我也想知道为什么我的问题被否决了,是的,我现在是一个简单的问题......
  • 不是从handle 方法返回值,而是调用另一个方法button.setOnAction(event-&gt;doSomeThingMethod());
  • @Mralladin,我不想给你坏消息,但这种方法永远不会返回你想要的值。它的工作是设置 EventHandlers 然后立即返回,它甚至会在按钮被按下之前返回。所以你必须重新考虑你的代码,并通过在按下按钮时调用一个方法来做你想做的事情,请参阅上面的 Colns Abt 的评论,或下面的我的回答,以获得一些想法。祝你好运!

标签: java loops javafx eventhandler


【解决方案1】:

两件事:

-您需要创建可变变量 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);

祝你好运!

【讨论】:

  • 我假设您实际上并没有尝试过该代码。它不会编译。
  • 当然,因为原始代码既不是概念输入,也不是概念输出,而是说明如何在内部类中使用可变变量的当前值。但是我错过了您指出该方法的返回类型实际上是无效的评论,所以我会更新这个答案。
【解决方案2】:

您需要在您的按钮处理程序方法中设置一个值,并从您的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 类的一些功能:最好只使用该类而不是创建自己的对话框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多