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);
}
}