jp2launcher.exe не завершается с закрытием апплета

Если я закрою апплет с содержимым JavaFX (то есть апплет использует EDT и поток JavaFX), jp2launcher.exe продолжит работу в течение почти 1 минуты, поэтому апплет не может быть легко запущен снова (как только он не будет распознан как новый экземпляр - после закрытия браузера так далее.).

У меня есть поиск Google, но я не нашел решения. Я нашел только очень похожую проблему - https://bugs.openjdk.java.net/browse/JDK-8051030.

Другое решение было бы, если апплет мог запускаться на длительном jp2launcher.exe, но это не может. Это просто не вызывается. Только метод инициализации JApplet переопределяется.

import javax.swing.JApplet;
import javax.swing.SwingUtilities;

import java.awt.Graphics;

import javafx.embed.swing.JFXPanel;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.animation.Timeline;

/*<applet code="sample" width=600 height=600></applet>*/

public class sample extends JApplet{
  protected Scene scene;
  protected Group group;
  Timeline timeline;    
  JFXPanel fxPanel;


  @Override
  public final void init(){initSwing();}

  private void initSwing(){     
    fxPanel = new JFXPanel();
    add(fxPanel);

    Platform.runLater(() ->{initFX(fxPanel);});
  }

  private void initFX(JFXPanel fxPanel){
    timeline=new Timeline();        
group=new Group();
scene=new Scene(group);         
}       

  @Override
  public void start(){
    try{SwingUtilities.invokeAndWait(this::initSwing);}
    catch(java.lang.InterruptedException|java.lang.reflect.InvocationTargetException e){}}  
}

1 ответ

Основываясь на вашем обновлении,

  • Я не могу воспроизвести проблему на показанной платформе; нет заметного увеличения задержки между выбором выхода из апплета и возвращением в командную строку. В случае, если проблема связана с платформой, я включил пример, проверенный для справки.

    $ javac sample.java ; appletviewer sample.java
    
  • Здесь отмечается: "В апплете задача создания GUI должна быть запущена из init метод с использованием invokeAndWait ". Applet::start слишком поздно.

  • Я не вижу исключений, я вижу java.lang.IllegalStateException на quit когда JFXPanel пуст или неинициализирован.

образ

import javafx.embed.swing.JFXPanel;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javax.swing.JApplet;
import javax.swing.SwingUtilities;

/*<applet code="sample" width=300 height=200></applet>*/
public class sample extends JApplet {

    protected Scene scene;
    protected Group group;
    JFXPanel fxPanel;

    @Override
    public final void init() {
        try {
            SwingUtilities.invokeAndWait(this::initSwing);
        } catch (java.lang.InterruptedException | java.lang.reflect.InvocationTargetException e) {
            e.printStackTrace(System.out);
        }
    }

    private void initSwing() {
        fxPanel = new JFXPanel();
        add(fxPanel);
        Platform.runLater(() -> {
            initFX(fxPanel);
        });
    }

    private void initFX(JFXPanel fxPanel) {
        group = new Group();
        group.getChildren().add(new Label(
            System.getProperty("os.name") + " v"
            + System.getProperty("os.version") + "; Java v"
            + System.getProperty("java.version")));
        scene = new Scene(group);
        fxPanel.setScene(scene);
    }
}
Другие вопросы по тегам