嗨,我知道这应该是基础知识,但我真的很困难 我想返回单击按钮的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作为覆盖方法。
答案 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
类的一些功能:使用该类而不是创建自己的对话框可能更好。