2012-05-16 14 views
11

Tengo un problema que tal vez es causado por una falta de comprensión en algunos principios de la plataforma Netbeans (7.1.2) o JavaFX 2. Quería agregar un JFXPanel con un Scene muy simple a un Swing JPanel que es hijo de un TopComponent. He logrado esto mediante el siguiente código:¿Por qué desaparece el contenido de JavaFX en mi TopComponent?

public accexTopComponent() { 
    initComponents(); 
    setName(Bundle.CTL_accexTopComponent()); 
    setToolTipText(Bundle.HINT_accexTopComponent()); 
    putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE); 



    //Begin of my code 
    myFX = new JFXPanel(); //myFX is a static JFXPanel 
    Platform.runLater(new Runnable() { 

     @Override 
     public void run() { 

      myFX.setScene(new Scene(ButtonBuilder.create().minHeight(40.0).minWidth(40.0).build())); 

     } 
    }); 

     jPanel1.add(myFX); 



} 

Esto compila sin problemas y una JavaFX Button se visualiza cuando muestro la TopComponent por primera vez. Pero tan pronto como el componente se oculta y se vuelve a mostrar, el JavaFX Button desaparece mientras los otros elementos secundarios aún están visibles.

¿Por qué desaparece el contenido de JavaFX?

Editar:

ahora incluyen la fuente de toda la TopComponent. Supongo que eso es todo lo que necesitas para probarlo por ti mismo. No cambié ningún otro archivo.

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package de.jeed.nbgan.accexplorer; 

import java.awt.Color; 
import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.Scene; 
import javafx.scene.control.ButtonBuilder; 
import javafx.scene.text.TextBuilder; 
import javafx.scene.web.WebView; 
import javafx.scene.web.WebViewBuilder; 
import org.netbeans.api.settings.ConvertAsProperties; 
import org.openide.awt.ActionID; 
import org.openide.awt.ActionReference; 
import org.openide.windows.TopComponent; 
import org.openide.util.NbBundle.Messages; 

/** 
* Top component which displays something. 
*/ 
@ConvertAsProperties(dtd = "-//de.jeed.nbgan.accexplorer//accex//EN", 
autostore = false) 
@TopComponent.Description(preferredID = "accexTopComponent", 
//iconBase="SET/PATH/TO/ICON/HERE", 
persistenceType = TopComponent.PERSISTENCE_ALWAYS) 
@TopComponent.Registration(mode = "explorer", openAtStartup = true) 
@ActionID(category = "Window", id = "de.jeed.nbgan.accexplorer.accexTopComponent") 
@ActionReference(path = "Menu/Window" /* 
* , position = 333 
*/) 
@TopComponent.OpenActionRegistration(displayName = "#CTL_accexAction", 
preferredID = "accexTopComponent") 
@Messages({ 
    "CTL_accexAction=accex", 
    "CTL_accexTopComponent=Konten-Explorer", 
    "HINT_accexTopComponent=Durchsuchen von Abteilungen und Konten" 
}) 
public final class accexTopComponent extends TopComponent { 

    static JFXPanel myFX; 

    public accexTopComponent() { 
     initComponents(); 
     setName(Bundle.CTL_accexTopComponent()); 
     setToolTipText(Bundle.HINT_accexTopComponent()); 
     putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE); 
     myFX = new JFXPanel(); 
     Platform.runLater(new Runnable() { 

      @Override 
      public void run() { 

       myFX.setScene(new       Scene(ButtonBuilder.create().minHeight(40.0).minWidth(40.0).build())); 

     } 
    }); 

     jPanel1.add(myFX); 


} 

/** 
* 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() { 

    jPanel1 = new javax.swing.JPanel(); 

    jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); 
    jPanel1.setLayout(new java.awt.GridBagLayout()); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
    this.setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(54, 54, 54) 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(153, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(33, 33, 33) 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(74, Short.MAX_VALUE)) 
    ); 
}// </editor-fold>       
// Variables declaration - do not modify      
private javax.swing.JPanel jPanel1; 
// End of variables declaration     

@Override 
public void componentOpened() { 
    // TODO add custom code on component opening 
} 

@Override 
public void componentClosed() { 
    // TODO add custom code on component closing 
} 

void writeProperties(java.util.Properties p) { 
    // better to version settings since initial version as advocated at 
    // http://wiki.apidesign.org/wiki/PropertyFiles 
    p.setProperty("version", "1.0"); 
    // TODO store your settings 
} 

void readProperties(java.util.Properties p) { 
    String version = p.getProperty("version"); 
    // TODO read your settings according to their version 
} 
} 

En mi caso, esto TopComponent es parte de un componente llamado AccountExplorer que hace referencia a JavaFX y está referenciada por una plataforma de aplicaciones NB llanura.

+0

me trató de reproducir el problema con NetBeans 7.1 y 2.1 JavaFX. Todos los componentes vuelven a aparecer como se esperaba. Publica un SSCCE, por favor. – pmoule

+0

Gracias por el esfuerzo. Ver mi proyecto [aquí] (https://rapidshare.com/files/894496305/FinancialEngineer.7z) – dajood

+0

Lo sentimos, no hay enlaces de descarga de proyectos, por favor. Para involucrar a los demás y hacerlo más atractivo para ayudar, publique un [SSCCE] (http://pscode.org/sscce.html). – pmoule

Respuesta

16

Prueba esto:

Platform.setImplicitExit(false); 
4

Experimentamos el mismo problema. Con base en los siguientes hilos, asumimos que una vez que el panel ya no es visible, JavaFX Platform sale automáticamente porque todos los elementos de la GUI de JavaFX ya no están visibles.

Esta suposición se basa en información de:
https://forums.oracle.com/forums/thread.jspa?messageID=10287328 y
https://forums.oracle.com/forums/thread.jspa?threadID=2390971

Un primer intento en nuestro environnment es añadir un JFXPanel ficticias en alguna parte del código y dejarla allí hasta las salidas del programa parece funcionar .

segundo intento en su código también funciona:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package de.jeed.nbgan.accexplorer; 

import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.geometry.Rectangle2D; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.ButtonBuilder; 
import javafx.scene.paint.Color; 
import javafx.stage.Modality; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 
import org.netbeans.api.settings.ConvertAsProperties; 
import org.openide.awt.ActionID; 
import org.openide.awt.ActionReference; 
import org.openide.windows.TopComponent; 
import org.openide.util.NbBundle.Messages; 

/** 
* Top component which displays something. 
*/ 
@ConvertAsProperties(dtd = "-//de.jeed.nbgan.accexplorer//accex//EN", 
autostore = false) 
@TopComponent.Description(preferredID = "accexTopComponent", 
//iconBase="SET/PATH/TO/ICON/HERE", 
persistenceType = TopComponent.PERSISTENCE_ALWAYS) 
@TopComponent.Registration(mode = "explorer", openAtStartup = true) 
@ActionID(category = "Window", id = "de.jeed.nbgan.accexplorer.accexTopComponent") 
@ActionReference(path = "Menu/Window" /* 
* , position = 333 
*/) 
@TopComponent.OpenActionRegistration(displayName = "#CTL_accexAction", 
preferredID = "accexTopComponent") 
@Messages({ 
    "CTL_accexAction=accex", 
    "CTL_accexTopComponent=Konten-Explorer", 
    "HINT_accexTopComponent=Durchsuchen von Abteilungen und Konten" 
}) 
public final class accexTopComponent extends TopComponent { 

    static JFXPanel myFX; 
    static JFXPanel myDummyFXtoKeepJavaFxRunning; 

    public accexTopComponent() { 
     initComponents(); 
     setName(Bundle.CTL_accexTopComponent()); 
     setToolTipText(Bundle.HINT_accexTopComponent()); 
     putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE); 
     myFX = new JFXPanel(); 
     myDummyFXtoKeepJavaFxRunning = new JFXPanel(); 
     Platform.runLater(new Runnable() { 

      @Override 
      public void run() { 
       // Actual FX code that will be hidden/shown 
       myFX.setScene(new Scene(ButtonBuilder.create().minHeight(40.0).minWidth(40.0).build())); 

       // Workaround 
       Stage dummyPopup = new Stage(); 
       dummyPopup.initModality(Modality.NONE); 
       // set as utility so no iconification occurs 
       dummyPopup.initStyle(StageStyle.UTILITY); 
       // set opacity so the window cannot be seen 
       dummyPopup.setOpacity(0d); 
       // not necessary, but this will move the dummy stage off the screen 
       final Screen screen = Screen.getPrimary(); 
       final Rectangle2D bounds = screen.getVisualBounds(); 
       dummyPopup.setX(bounds.getMaxX()); 
       dummyPopup.setY(bounds.getMaxY()); 
       // create/add a transparent scene 
       final Group root = new Group(); 
       dummyPopup.setScene(new Scene(root, 1d, 1d, Color.TRANSPARENT)); 
       // show the dummy stage 
       dummyPopup.show(); 

       // size back to scene size 
       dummyPopup.sizeToScene(); 

       // if you centered it before hiding 
       //dummyPopup.centerOnScreen();  
      } 
     }); 

     jPanel1.add(myFX); 
    } 

    /** 
    * 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() { 

     jPanel1 = new javax.swing.JPanel(); 

     jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); 
     jPanel1.setLayout(new java.awt.GridBagLayout()); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
     this.setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(54, 54, 54) 
       .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(153, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(33, 33, 33) 
       .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(74, Short.MAX_VALUE)) 
     ); 
    }// </editor-fold>       
    // Variables declaration - do not modify      
    private javax.swing.JPanel jPanel1; 
    // End of variables declaration     

    @Override 
    public void componentOpened() { 
     // TODO add custom code on component opening 
    } 

    @Override 
    public void componentClosed() { 
     // TODO add custom code on component closing 
    } 

    void writeProperties(java.util.Properties p) { 
     // better to version settings since initial version as advocated at 
     // http://wiki.apidesign.org/wiki/PropertyFiles 
     p.setProperty("version", "1.0"); 
     // TODO store your settings 
    } 

    void readProperties(java.util.Properties p) { 
     String version = p.getProperty("version"); 
     // TODO read your settings according to their version 
    } 
} 
+0

Ya no tenía esperanza. Muchas gracias, eso es realmente una gran ayuda para mí. – dajood

+5

La solución real debería estar en javaFX 2.2 Ver http://javafx-jira.kenai.com/browse/RT-15011 Uno debería estar usando Platform.setImplicitExit (boolean implicitExit). – Escay

1

me quedé atrapado en el mismo problema: tengo el problema no sólo con el componente de la parte superior. .. pero también con mis ventanas de diálogo modal. En algunos sistemas operativos parecen funcionar al principio (Windows) en otros, los diálogos comienzan como cuadros negros, vacíos (linux). En algunos cuadros de diálogo (en Windows) mientras se trabaja con el cuadro de diálogo (generalmente después de hacer clic en los botones), el cuadro de diálogo también se vacía (por lo general, después del sexto clic o más). Al mover el mouse (sin hacer clic) sobre los botones, reaparecen (pero no el resto)

También tengo el efecto (al menos en Windows) de que al minimizar y restaurar la ventana principal se genera una ventana vacía.

Pero: (!!!!!) ¡Descubrí que cambiar el tamaño de la ventana principal o los cuadros de diálogo con el mouse devuelve el contenido! Entonces, asumo que su suposición con la muerte prematura no puede ser la razón (¿por qué debería volver entonces?).

para los diálogos he encontrado una solución: Método hacer la escena de la ventana de un miembro de la clase para que pueda acceder a ella más tarde en el siguiente repinte():

/** 
    * force repaint by re-setting the scene 
    * This solves a repainting bug in JavaFx 1.8.05 
    */ 
    private void repaint(){ 
    setScene(null); 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
     setScene(scene); 
     } 
    }); 
    } 

En un diálogo que utilizo repinte () justo antes de showModal() y al final de cada evento de botón -> funciona bien :-) Pero no he encontrado un evento donde puedo llamar a repintar() después de la minimización de la ventana principal. Ahora una nueva mística pero una solución: Si coloco repintado() justo antes de mostrar() para MainWindow todo funciona bien. No tengo idea de por qué ...

Pero definitivamente creo que se trata de un error en JavaFX que con suerte se solucionará en la próxima versión.

Saludos

Ingo

Cuestiones relacionadas