JavaFX,从root.getChildren()中提取所有按钮的子节点

时间:2016-01-31 20:49:05

标签: java javafx

我刚开始使用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

2 个答案:

答案 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));