我刚开始使用JavaFX,我将尝试进行简单的计算。
我有那个代码来制作我的所有按钮:
Button one = new Button("1");
Button two = new Button("2");
Button three = new Button("3");
Button four = new Button("4");
Button five = new Button("5");
Button six = new Button("6");
Button seven = new Button("7");
Button eight = new Button("8");
Button nine = new Button("9");
Button zero = new Button("0");
Button dot = new Button(".");
Button pow = new Button("^2");
TextField equation = new TextField();
Button equal = new Button("=");
Button multiple = new Button("*");
Button divide = new Button("/");
Button takefrom = new Button("-");
Button add = new Button("+");
在start方法中,将它们全部添加到框中,然后添加到根目录。我的主要类实现了EvendHandler。现在我想将.onAction(this)应用于每个按钮。
有一种方法只能从根节点中提取按钮吗?
我尝试了getChildren()然后为每一个尝试,但我无法让它工作。
有一个好习惯,只为我的按钮制作一个arraylist,然后制作一个可以做到这一点的循环吗?
还是有另一种方式?
所有代码均可在以下网址找到: http://pastebin.com/RBzbn8bT
答案 0 :(得分:0)
要仅提取按钮,您可以使用instanceof关键字。
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
在您的情况下,您可以遍历根的所有子项并检查它们是否属于Button类。
例如:
for(int i=0; i<root.getChildren().size(); i++)
if(root.getChildren().get(i) instanceof Button) {
your code here
}
答案 1 :(得分:0)
你可以使用instanceof
测试,或者(有点诡计)做lookup
。但这些都不是特别好的解决方案:更优雅的解决方案就是定义一个或多个创建按钮的方法,并将每个按钮所需的所有代码放在那里。这样,您可以轻松地为每个按钮定义不同的处理程序。
这个基本想法是这样的:
public class Calculator extends Application {
private GridPane root ;
@Override
public void start(Stage primaryStage) {
root = new GridPane()
// zero button:
root.add(1, 4, createNumericalButton(0));
// buttons for 1-9:
for (int i = 1 ; i <= 9 ; i++) {
Button button = createNumericalButton(i);
int row = 2 - (i-1)/3 ; // {7,8,9} -> 0; {4,5,6} -> 1; {1,2,3}->2
int col = (i-1) % 3 ;
root.add(col, row, button);
}
// other layout...
}
private Button createNumericalButton(final int n) {
Button button = new Button(Integer.toString(n));
button.setMinSize(32, 32);
button.setOnAction(event -> {
// replace with real handler...
System.out.println("Pressed "+n);
}
return button ;
}
}
您可以类似地定义用于为createOperationButton(...)
,+
,-
和*
等创建按钮的/
方法。如果您想获得更复杂一点,该方法可以将DoubleBinaryOperator
作为参数,用于指定每个按钮的行为。所以你最终会做类似的事情:
root.add(4, 3, createOperationButton("+", (x, y) -> x + y));
root.add(4, 2, createOperationButton("-", (x, y) -> x - y));
root.add(4, 1, createOperationButton("*", (x, y) -> x * y));
root.add(4, 0, createOperationButton("/", (x, y) -> x / y));