Java 如何返回按下的按钮的值
嗨,我知道这应该是基本的,但我真的卡住了 我想返回被点击的按钮的int值并关闭对话框Java 如何返回按下的按钮的值,java,loops,javafx,eventhandler,Java,Loops,Javafx,Eventhandler,嗨,我知道这应该是基本的,但我真的卡住了 我想返回被点击的按钮的int值并关闭对话框 public static int showButtonDialog(String title, String label, String[] button) { ArrayList<Button> buttons = new ArrayList<>(); Stage dialog = new Stage(); boolean value = false;
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;
}
}
public static int showButtonDialog(字符串标题、字符串标签、字符串[]按钮)
{
ArrayList按钮=新建ArrayList();
阶段对话框=新阶段();
布尔值=假;
GridPane=新建GridPane();
场景层=新场景(疼痛);
dialog.setScene(层);
dialog.initmodel(model.APPLICATION\u model);
对话框。设置标题(标题);
添加(新标签,0,0);
对于(int i=0;i
但是,我如何使方法句柄返回int,它是一个覆盖方法。2件事:
-您需要创建可变变量i的最终副本,以便在代码中引用它
final int finalI = i;
buttons.get(i).setOnAction(new EventHandler<ActionEvent>()
... the rest of your code...
祝你好运 2件事:
-您需要创建可变变量i的最终副本,以便在代码中引用它
final int finalI = i;
buttons.get(i).setOnAction(new EventHandler<ActionEvent>()
... the rest of your code...
祝你好运 您需要在按钮处理程序方法中设置一个值,并从
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 ;
}
public static int showButtonDialog(字符串标题、字符串标签、字符串[]按钮)
{
ArrayList按钮=新建ArrayList();
阶段对话框=新阶段();
布尔值=假;
GridPane=新建GridPane();
场景层=新场景(疼痛);
dialog.setScene(层);
dialog.initmodel(model.APPLICATION\u model);
对话框。设置标题(标题);
添加(新标签,0,0);
类值持有者{int value;}
估价师估价师=新估价师();
valueHolder.value=-1;
对于(int i=0;i buttons.get(i).setOnAction(新的EventHandler类:使用该类而不是创建自己的对话框可能更好。您需要在按钮处理程序方法中设置一个值,并从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 ;
}
public static int showButtonDialog(字符串标题、字符串标签、字符串[]按钮)
{
ArrayList按钮=新建ArrayList();
阶段对话框=新阶段();
布尔值=假;
GridPane=新建GridPane();
场景层=新场景(疼痛);
dialog.setScene(层);
dialog.initmodel(model.APPLICATION\u model);
对话框。设置标题(标题);
添加(新标签,0,0);
类值持有者{int value;}
估价师估价师=新估价师();
valueHolder.value=-1;
对于(int i=0;i buttons.get(i).setOnAction(新的EventHandler类:使用该类而不是创建自己的对话框可能更好。你不能。句柄方法是无效。你会在哪里收到返回值?@James\u D是对的,句柄()
方法是无效的,但如何返回按钮的值呢?我单击了按钮,这是一个如此简单的问题,我已经尝试在内部匿名类中编写另一个方法,但他只启动句柄,不返回任何内容…我也想知道为什么我的问题会被否决是的,我现在用简单的问题来乞讨…而不是重新开始从handle
方法中打开一个值,只需调用另一个方法按钮。setOnAction(event->doSomeThingMethod());
@Mralladin,我不想告诉你一个坏消息,但是这个方法永远不会返回你想要的值。它的工作是设置EventHandler,然后立即返回,甚至在按下按钮之前就会返回。所以你必须重新思考你的代码,并在按下按钮时调用一个方法来做你想做的事情,请参阅Colns Abt在上面的评论,或者我在下面的回答,来获取一些想法。祝你好运!你不能。handle
方法是void
。你会在哪里收到返回值?@James_D是对的,handle()
方法是无效的,但如何返回按钮的值呢?我单击了按钮,这是一个如此简单的问题,我已经尝试在内部匿名类中编写另一个方法,但他只启动句柄,不返回任何内容…我也想知道为什么我的问题会被否决是的,我现在用简单的问题来乞讨…而不是重新开始从handle
方法中打开一个值,您只需调用另一个方法按钮。setOnAction(event->doSomeThingMethod());
@Mralladin,我不想告诉您坏消息,但此方法永远不会返回