Как добавить графический интерфейс из другого класса JavaFX?

261
07 сентября 2021, 23:00

Решил написать что-то простейшее с графическим интерфейсом (знания ничтожные, поэтому сильно не душите), использовал библиотеку javafx, думаю такой:"для графического интерфейса, наверное, нужно создать отдельный класс". Создал отдельный класс, добавил туда панели, разные элементы, и возник вопрос: а как в классе со scene и stage реализовать класс с этим графич.интерфейсом? Написал gr = new graphic(); scene = new Scene(gr, 640, 480); (хотя не совсем понимаю что это), но что-то не работает(.

Main.java

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application{
    private Scene scene;
    private graphic gr;
    public static void main(String[] args) {
Application.launch(args);
    }
    @Override
    public void start(Stage stage) throws Exception {
        gr = new graphic();
scene = new Scene(gr, 640, 480);
stage.setTitle("Hello world!");
stage.setScene(scene);
stage.show();
    }
}

graphic.java

import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
public class graphic extends Parent {
    graphic(){
        Button first = new Button("First");
        Button second = new Button("Second");
        Button third = new Button("Third");
        Button fourth = new Button("Fourth");
        GridPane root = new GridPane();
        ColumnConstraints column1 = new ColumnConstraints();
        column1.setPercentWidth(50);
        root.getColumnConstraints().add(column1);
        ColumnConstraints column2 = new ColumnConstraints();
        column2.setPercentWidth(50);
        root.getColumnConstraints().add(column2);
        RowConstraints row1 = new RowConstraints();
        row1.setPercentHeight(50);
        root.getRowConstraints().add(row1);
        RowConstraints row2 = new RowConstraints();
        row2.setPercentHeight(50);
        root.getRowConstraints().add(row2);
        root.setGridLinesVisible(true);
        root.add(first, 0, 0);
        root.add(second, 0, 1);
        root.add(third, 1, 0);
        root.add(fourth, 1, 1);
    }
}
Answer 1

Ваш graphic это нода javafx, которую вы встраиваете в scene. В конструкторе graphic вы создаете GridPane который нигде потом не используется, в саму сцену добавляется только graphic.

Самый простой способ исправить код это:

  1. Убрать extends Parent у класса graphic
  2. Заменить конструктор класса grapic на статический метод: public static GridPane getRoot (){
  3. В конце этого метода сделать return root;
  4. В сцену передавать не инстанс класса, а результат вызова getRoot()

public class graphic extends Parent {
    public static GridPane getRoot (){
        Button first = new Button("First");
        // ... вырезал для краткости
        GridPane root = new GridPane();
        // ... вырезал для краткости
        root.add(first, 0, 0);
        // ... вырезал для краткости
        return root;
    }
}

public class Main extends Application{
    private Scene scene;
    public static void main(String[] args) {
        Application.launch(args);
    }
    @Override
    public void start(Stage stage) {
        scene = new Scene(graphic.getRoot(), 640, 480);
        stage.setTitle("Hello world!");
        stage.setScene(scene);
        stage.show();
    }
}
Answer 2

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

READ ALSO
Optional<T> в List<T>

Optional<T> в List<T>

Java 8Можно ли преобразовать Optional в List?

114
Объединение многоугольников в один

Объединение многоугольников в один

Есть два многоугольника заданных массивами с координатамиНужно как-то объединить их в один многоугольник и получить на выходе новый массив...

99
Как получить текст вместо ссылки android.content.res.Resourses$Theme@e87d8e

Как получить текст вместо ссылки android.content.res.Resourses$Theme@e87d8e

Я записываю данные из EditText в словарь, обрабатываю с помощью JSON и сохраняю в файл

289