Как использовать JavaFx для GUI и PApplet для вывода (в разных окнах) - PullRequest
0 голосов
/ 25 декабря 2018

Я работаю над приложением, которое использует JavaFX в качестве графического интерфейса пользователя для управления PApplet , который запускается в другом окне.

Мне удалось сделатьэти две вещи появляются и работают, но когда я пытаюсь загрузить файлы в классе PApplet, я получаю предупреждение с именем "The sketch path is not set" и такую ​​ошибку: "java.lang.RuntimeException: Files must be loaded inside setup() or after it has been called."

Я предполагаю, чтоВозможно, я неправильно инициализировал PApplet.

Вот мой класс javafx.Application

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("application.fxml"));
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setTitle("Clusters");
            primaryStage.setScene(scene);
            primaryStage.show();

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

    public static void main(String[] args) {
        PApplet.main("application.Controller");
        launch(args);
    }
}

Вот мой класс PApplet

public class Controller extends PApplet {

    private ArrayList<File> files;
    private ArrayList<PImage> images;

    public Controller() {
    }

    public void settings() {
        size(640, 360);
    }

    public void setup() {
        background(0);     
        images = new ArrayList<PImage>();
        files = new ArrayList<File>();
    }

    public void draw() {
    }

    public void importImages() {
        // Open File Chooser
        FileChooser dialog = new FileChooser();
        dialog.setTitle("Import Images");
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("Image files (*.jpg, *.png, *.tiff)", "*.jpg", "*.png", "*.tiff");
        dialog.getExtensionFilters().add(extFilter);
        List<File> imported_files = dialog.showOpenMultipleDialog(new Stage());
        System.out.println(imported_files); 

        for (File f: imported_files) {
            images.add(loadImage(f.getAbsolutePath()));
            System.out.println(f.getName() + " loaded");
        }
    }
}

Так я связываю метод importImages () с файлом FXXML

      <Menu mnemonicParsing="false" text="File">
        <items>
          <MenuItem fx:id="file_open" mnemonicParsing="false" text="Open" />
              <MenuItem fx:id="file_save" mnemonicParsing="false" text="Save" />
              <MenuItem fx:id="file_save_as" mnemonicParsing="false" text="Save As" />
              <MenuItem fx:id="file_import" mnemonicParsing="false" onAction="#importImages" text="Import" />
        </items>
      </Menu>

1 Ответ

0 голосов
/ 25 декабря 2018

Я предполагаю, что функции обработки, такие как loadImage(), должны вызываться из основного потока обработки, а функции JavaFX, такие как dialog.showOpenMultipleDialog(), должны вызываться из потока приложения JavaFX.

Вкладывание работы в JavaFXТема приложения довольно проста.Прочитайте Параллелизм в JavaFX и JavaFX, работающий с потоками и GUI (или просто найдите что-то вроде "JavaFX thread" для получения множества результатов).Но, в принципе, вы можете вызвать функцию Platform.runLater(), чтобы поместить работу в поток приложений JavaFX.

Пойти другим путем и поместить работу в поток обработки немного сложнее.Вы можете прочитать больше о параллелизме здесь .

Чтобы проверить эту теорию, я бы сделал что-то простое, как это:

public class Controller extends PApplet {
  boolean loadImages = false;
  // other variables you need to communicate between threads

  public void draw() {
    if(loadImages){
      // call loadImages()
      loadImages = false;
    }
  }

  // call this from JavaFX
  public void importImages() {
    // set other variables you need here
    loadImages = true;
  }
}

Если это сработает, вы можете сделатьчто-то более необычное, например, поддержка очереди событий.

...