2016-05-03 2 views
1

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

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

Другое решение было бы, если апплет мог начаться с прочного jp2launcher.exe, но он не может. Это просто не вызывается. Только метод init 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){}} 
} 
+0

Измените свой вопрос включать [mcve]; обратите внимание, что [this] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) требуется от апплетов. – trashgod

+0

У меня есть разумный длинный образец этого поведения, но из-за его короткого замыкания вы можете видеть, что * jp2launcher.exe * заканчивается с очень небольшой задержкой, но определенно не заканчивается вместе с завершением апплета. –

ответ

1

На основе вашего обновления,

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

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

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

image

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); 
    } 
} 
Смежные вопросы