Как установить несколько кнопок и добавить их в gridPane

для графического интерфейса мне нужно установить несколько кнопок на GridPane. Для этого я хочу спросить, есть ли способ добавить несколько кнопок в сетку более элегантным способом, чем я. Вот выдержка из моего кода.

Button button0 =new Button("0");
    Button button1 =new Button("1");
    Button button2 =new Button("2");
    Button button3 =new Button("3");
    Button button4 =new Button("4");
    Button button5 =new Button("5");
    Button button6 =new Button("6");
    Button button7 =new Button("7");
    Button button8 =new Button("8");
    Button button9 =new Button("9");
    Button cancel = new Button("C");
    Button plus = new Button("+");
    Button minus = new Button("-");
    Button multiplicate = new Button("*");
    Button divide = new Button("/");
    Button equal = new Button("=");

Для всех этих кнопок мне нужно отдельно установить индекс строки и столбца.

root.setPadding(new Insets(5,5,5,5));
    GridPane.setConstraints(root, 4, 3);
    root.getChildren();
    root.add(label, 1, 1, 3, 1);
    root.add(button1, 2, 2);
    root.add(button2, 3, 2);
    root.add(button3, 4, 2);
    root.add(button4, 2, 3);
    root.add(button5, 3, 3);
    root.add(button6, 4, 3);
    root.add(button7, 2, 4);
    root.add(button8, 3, 4);
    root.add(button9, 4, 4);
    root.add(button0, 2, 5);
    root.add(cancel, 3, 5);
    root.add(plus, 5,2);
    root.add(minus, 5,3);
    root.add(multiplicate, 5, 4);
    root.add(divide, 5,5);
    root.add(equal, 4, 5);

Буду очень признателен за любые предложения.


person Marco Jakob    schedule 09.06.2016    source источник
comment
@Marko Jakob Я предлагаю вам вместо этого использовать FXML   -  person Marcel    schedule 09.06.2016
comment
Или, по крайней мере, используйте цикл для кнопки 0 - кнопки 9   -  person ItachiUchiha    schedule 09.06.2016
comment
OP должен использовать для этого построитель сцены, мне также не нравится использовать для этого GridPane, так как это похоже на калькулятор, а некоторые кнопки (например, '+') больше, чем другие ... Я бы настроил все на AnchorPane в SceneBuilder, а затем используйте разделители, чтобы разделить все на части. Конечно, вы можете сделать кнопки любого размера, который хотите, но это сложнее, если вы хотите изменить некоторые размеры ... Но может быть PITA, чтобы выровнять все разделители (просто посмотрите на x, y) для некоторых людей.   -  person XaolingBao    schedule 09.06.2016
comment
@Lasagna, спасибо за ваш комментарий, я бы тоже предпочел StackPane, но я хотел, чтобы кнопки выглядели как таблица. Вообразить, окно должно выглядеть как калькулятор, действительно, я хотел запрограммировать калькулятор, и проблема в том, что я не знаю FXML.   -  person Marco Jakob    schedule 09.06.2016
comment
Марко, вам нужен AnchorPane Найдите Scene Builder и загрузите его с сайта Oracle. По сути, это построитель графического интерфейса пользователя, который создает код FXML из того, что вы создаете, который вы можете импортировать в свой код. Вам нужно будет узнать о загрузке FXML и контроллерах с JavaFX, но гораздо проще работать с Scene Builder, когда у вас много компонентов. На самом деле это совсем не так сложно, и вам действительно не нужно знать FXML самостоятельно, только загрузку ваших файлов и то, как взаимодействовать с ними.   -  person XaolingBao    schedule 09.06.2016


Ответы (1)


Вы должны использовать файл FXML, как было предложено в комментарии.

Но если вы хотите придерживаться кода Java, вы можете сделать что-то вроде этого (я предлагаю по-прежнему иметь файл FXML):

Main.java

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            GridPane root = new GridPane();
            Scene scene = new Scene(root, 400, 400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());

            Button b = new Button();
            b.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                }
            });

            GridHelper.addToGrid(root, new Button("0"), 2, 5);
            GridHelper.addToGrid(root, new Button("1"), 2, 2);
            GridHelper.addToGrid(root, new Button("2"), 3, 2);
            GridHelper.addToGrid(root, new Button("3"), 4, 2);
            GridHelper.addToGrid(root, new Button("4"), 2, 3);
            GridHelper.addToGrid(root, new Button("5"), 3, 3);
            GridHelper.addToGrid(root, new Button("6"), 4, 3);
            GridHelper.addToGrid(root, new Button("7"), 2, 4);
            GridHelper.addToGrid(root, new Button("8"), 3, 4);
            GridHelper.addToGrid(root, new Button("9"), 4, 4);

            GridHelper.addToGrid(root, new Button("C"), 3, 5, e -> System.out.println("C"));
            GridHelper.addToGrid(root, new Button("+"), 5, 2, e -> System.out.println("+"));
            GridHelper.addToGrid(root, new Button("-"), 5, 3);
            GridHelper.addToGrid(root, new Button("*"), 5, 4);
            GridHelper.addToGrid(root, new Button("/"), 5, 5);
            GridHelper.addToGrid(root, new Button("="), 4, 5);

            root.setPadding(new Insets(5, 5, 5, 5));

            primaryStage.setScene(scene);
            primaryStage.show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static class GridHelper {

        static void addToGrid(GridPane grid, Node c, int col, int r) {
            grid.add(c, col, r);
        }

        static void addToGrid(GridPane grid, Node c, int col, int r, EventHandler<ActionEvent> event) {
            grid.add(c, col, r);
            addButtonEvent(c, event);
        }

        static void addToGrid(GridPane grid, Node c, int col, int r, int cs, int rs) {
            grid.add(c, col, r, cs, rs);
        }

        static void addToGrid(GridPane grid, Node c, int col, int r, int cs, int rs, EventHandler<ActionEvent> event) {
            grid.add(c, col, r, cs, rs);
            addButtonEvent(c, event);
        }

        static void addButtonEvent(Node button, EventHandler<ActionEvent> event) {
            if (button instanceof Button)
                ((Button) button).setOnAction(event);
        }

    }

    public static void main(String[] args) {
        launch(args);
    }
}

Он просто вводит статический класс, который предоставляет некоторые статические методы для добавления Node к GridPane в указанную позицию и, при необходимости, установки промежутков (строка / столбец). Если это Button, вы также можете добавить событие для прессы. Конечно, можно обобщить и дальше, это всего лишь образец для точного вопроса.

Также вы можете сделать цикл для Buttons 0–9 (как это было предложено в комментарии).

person DVarga    schedule 09.06.2016