Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema con javafx

Hola, yo de nuevo, tengo un problema con javafx, lo uso solo en una ventana JDialog para mostrar un video de youtube y lo abro con un boton, funciona todo correctamente pero no logro hacer que una vez cierre el JDialog, javafx se cierre, osea, sino me equivoco cuando uno ejecuta porejemplo una web con javafx, el thread de javafx se ejecuta hasta que cierre la última ventana, osea hasta que cierre la aplicación, pero lo que yo necesito es que se cierre apenas cierre el JDialog por 2 motivos, primero porque sino, la aplicación queda como tildada, no me permite hacer nada ningun form y tengo que cerrar la aplicación y segundo para que no consuma recursos al vicio ya que la aplicación de por si consume bastante. Probe colocando en el setOnCloseRequest las siguientes 2 lineas:


webview.getEngine().load(null);
Platform.exit();

Con esas 2 lineas funciona bien, pero me salta una excepción ("Attempt to call defer when toolkit not running") y si intento volver a abrir el JDialog como en la funcion principal del jdialog llamo a la función "launch()" de javafx y ya se encuentra ejecutanse me devuelve un error. Si no coloco la primera linea, el video queda reproduciendose en segundo plano, y si no coloco la segunda línea, el frame principal de mi aplicación deja de responder y tengo que cerrar la aplicación.

El código que utilizo en el jdialog es el siguiente:


public class JavaFXClass extends Application {
@Override
public void start(final Stage stage) throws Exception {
final WebView webview = new WebView();
/*...*/
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
Platform.runLater( new Runnable() {
@Override
public void run() {
//Necesito detener javafx al cerrar el JDialog.
}
});
}
});
stage.show();
}

public static void CargarClase(String Datos) { //Uso esta función para cargar esta clase en un JDialog y mostrarlo como una ventana popup
/*...*/
launch(); //Devuelve error cuando intento abrir por segunda vez la ventana debido a que ya se encuentra ejecutandose.
}

el launch lo ejecuto en la ventana porque no me interesa que ese ejecute desde que inicio la aplicación, esta ventana que estoy creando es algo adicional que no siempre se usa y prefiero evitar inicializar javafx si no se va a utilizar.

Perdon si no uso palabras técnicas, no conozco bien javafx nunca lo use, poreso nose bien como funciona como para referirme correctamente. Espero puedan ayudarme. Muchas gracias de antemano. Saludos!

agosto 2, 2014 | Registered Commentermanuel2014

Llamar a stage.close() debería ser suficiente. JavaFX se cierra cuando no hay stage abiertos.

agosto 2, 2014 | Registered Commenterchoces

Hola choces, gracias por responder. En la publicación me confundí, no estoy usando un JDialog para mostrar la ventana (así lo hacia antes de implementar javafx), la ventana la crea el mismo javafx, si no me equivoco es el stage, ahora, lo de usar stage.close() ya lo había intentado, pero me di cuenta que no tiene sentido usarlo en la función stage.setOnCloseRequest porque se supone que si esta funcion es llamada es porque ya se ejecuto stage.close() al cerrar la ventana, si coloco una salida a consola con un mensaje en stage.setOnCloseRequest, al cerrar la ventana me lo imprime correctamente, pero el problema es que la aplicacion queda "tildada", no se puede hacer absolutamente nada, ni cerrarla desde la interface, me toca detener el proceso desde netbeans y no solo eso sino que el video que estaba reproduciendo en esa ventana se sigue escuchando, al parecer queda el thread ejecutandose. Nose bien porque pasa ni como solucionarlo :( probe muchas formas, en setOnCloseRequest (del stage) probe con todas las lineas siguientes:


stage.close();
webview.getEngine().load(null);
Platform.exit();
PlatformImpl.exit();
PlatformImpl.tkExit();

y ninguna soluciona el problema, algunas lo solucionan a medias, pero al parecer javafx no se cierra, porque al querer volver a llamar al launch(); que uso en la funcion "CargarClase" me da este error: "Application launch must not be called more than once".

agosto 2, 2014 | Registered Commentermanuel2014

¿Alguien que me de una mano con esto porfavor? Gracias!

agosto 8, 2014 | Unregistered CommenterManuel2014

.

agosto 8, 2014 | Registered Commentermercenario

mercenario, tu respuesta esta vacía :/

agosto 10, 2014 | Unregistered CommenterManuel2014

.

agosto 11, 2014 | Unregistered Commenteriko

Y si detienes la reproducción del video al momento de cerrar la ventana (Stage) ?

agosto 14, 2014 | Unregistered CommenterJavaSE

como puedo hacer para que se detenga el video? y aparte no es muy eficiente ya que de todas maneras la clase va a quedar consumiendo recursos en segundo plano, es como poner la ventana en hide y no solo eso sino que al querer volver a abrir la ventana me va a dar error ya que en el "main" de la clase llamo a la funcion launch que inicia javafx y va a dar error porque ya se encuentra ejecutandose.

agosto 14, 2014 | Unregistered CommenterManuel2014

Mira a ver si esto te puede ayudar:

http://stackoverflow.com/questions/22436498/how-to-stop-webengine-after-closing-stage-javafx

Un saludo.

agosto 22, 2014 | Unregistered Commenterjuanjo

Hola juanjo, hice unas pruebas con el código que publicaron en ese link que me pasaste y el mio pero no logro hacer que funcione bien del todo, de la nueva manera que probe, funciona perfectamente el frame del video, puedo abrirlo y cerrarlo sin problemas, pero ahora cuando intento darle play al video el reproductor muestra este error: "an error occurred, please try again later" y MUY POCAS veces no da el error y funciona bien, pero son muy pocas. De la forma que yo lo cargaba antes al video (extendiendo la clase a Application de JavaFX) funciona bien el video, pero en el "loader" de la clase llamo a la función "launch();" y una vez que abrí la ventana y la cerre ya no puedo volver a abrirla porque llama nuevamente a la funcion "launch()" y me da error de que ya se encuentra ejecutandose :/

agosto 23, 2014 | Unregistered CommenterManuel2014

Lo que sigue es una adaptación de un módulo de NetBeans Platform.
Se muestra cómo incrustar componentes de JavaFX en Swing, lo que creo que es la raíz de tu problema.

agosto 24, 2014 | Registered Commenterchoces

/**
<p>
@author Carlos Hoces
*/
public class NewJFrame extends javax.swing.JFrame {

/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
}

/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jPanel1 = new BrowserPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new java.awt.Dimension(743, 472));

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);

pack();
}// </editor-fold>

/**
@param args the command line arguments
*/
public static void main(String args[]) {

/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}

// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}

agosto 24, 2014 | Registered Commenterchoces

public class BrowserPanel extends JPanel {

private static final int PANEL_WIDTH_INT = 675;
private static final int PANEL_HEIGHT_INT = 400;
private static final long serialVersionUID = 2473614123348012441L;

public BrowserPanel() {

initComponents();
setName("Browser");
SwingUtilities.invokeLater(() -> {
final JFXPanel fxPanel = new JFXPanel();
add(fxPanel, BorderLayout.CENTER);
Platform.runLater(() -> {
Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();
Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();
WebView view = new WebView();
view.setMinSize(widthDouble, heightDouble);
view.setPrefSize(widthDouble, heightDouble);
final WebEngine eng = view.getEngine();
final Label warningLabel = new Label("Do you need to specify web proxy information?");
eng.load("http://google.com");
ChangeListener<Number> handler = (ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
if (warningLabel.isVisible()) {
warningLabel.setVisible(false);
}
};
eng.getLoadWorker().progressProperty().addListener(handler);
final TextField locationField = new TextField("http://www.oracle.com/us/index.html");
locationField.setMaxHeight(Double.MAX_VALUE);
Button goButton = new Button("Go");
goButton.setDefaultButton(true);
EventHandler<ActionEvent> goAction = (ActionEvent event) -> {
eng.load(locationField.getText().startsWith("http://") ? locationField.getText()
: "http://" + locationField.getText());
};
goButton.setOnAction(goAction);
locationField.setOnAction(goAction);
eng.locationProperty().addListener((ObservableValue<? extends String> observable1, String oldValue1, String newValue1) -> {
locationField.setText(newValue1);
});
GridPane grid = new GridPane();
grid.setPadding(new Insets(5));
grid.setVgap(5);
grid.setHgap(5);
GridPane.setConstraints(locationField, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES);
GridPane.setConstraints(goButton, 1, 0);
GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
GridPane.setConstraints(warningLabel, 0, 2, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES);
grid.getColumnConstraints().addAll(
new ColumnConstraints(widthDouble - 200, widthDouble - 200, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true),
new ColumnConstraints(40, 40, 40, Priority.NEVER, HPos.CENTER, true));
grid.getChildren().addAll(locationField, goButton, warningLabel, view);
fxPanel.setScene(new Scene(grid));
});
});

}

/**
This method is called from within the constructor to initialize the form.
WARNING: Do NOT modify this code. The content of this method is always
regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

setLayout(new java.awt.BorderLayout());
}// </editor-fold>

// Variables declaration - do not modify
// End of variables declaration
}

agosto 24, 2014 | Registered Commenterchoces

Hola, choces, perdon por la demora, ese no es el problema, si inserto correctamente los componentes de javafx en swing, si te fijas en el código que me pasaste pasa exactamente lo que comento, no reproduce los videos de youtube, en el reproductor muestra un error, ya estoy comenzando a pensar que es problema del javafx que viene con JDK 1.8 hace la prueba, entra a youtube.com desde el modulo que me pasaste y vas a ver que sale un error que dice "An error as occurred, please try again later.". Al parecer el problema esta en la inicialización de javafx porque si te fijas, al cerrar y volver a abrir varias veces la aplicación aveces logras que los reproduzca bien y mientras no cierres la aplicación, se van a reproducir correctamente todos los videos, pero una vez que lo cerras y lo volves a abrir lo mas probable es que deje de funcionar nuevamente. Me parece que el problema esta en la versión de javafx pero no estoy seguro.

agosto 27, 2014 | Unregistered CommenterManuel2014