2012-05-16 18 views
11

Ho un problema che potrebbe essere causato da una mancanza di comprensione in alcuni principi della piattaforma Netbeans (7.1.2) o JavaFX 2. Volevo aggiungere uno JFXPanel con uno Scene molto semplice a uno Swing JPanel che è un figlio di un TopComponent. Ho raggiunto questo dalla seguente codice:Perché scompare il contenuto JavaFX sul mio 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); 



} 

Questo compila senza un problema e una JavaFX Button viene visualizzato quando mostro il TopComponent per la prima volta. Ma non appena il componente viene nascosto e mostrato di nuovo, JavaFX Button scompare mentre gli altri bambini sono ancora visibili.

Perché il contenuto JavaFX scompare?

Edit:

io ora includono la fonte di tutta la TopComponent. Immagino sia tutto ciò che serve per testarlo da solo. Non ho cambiato nessun altro file.

/* 
* 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 
} 
} 

Nel mio caso, questo TopComponent fa parte di un componente chiamato AccountExplorer che fa riferimento JavaFX e fa riferimento un'applicazione semplice NB Platform.

+0

ho cercato di riprodurre il problema utilizzando NetBeans 7.1 e JavaFX 2.1. Tutti i componenti riappaiono come previsto. Pubblica un SSCCE, per favore. – pmoule

+0

Grazie per lo sforzo. Vedi il mio progetto [qui] (https://rapidshare.com/files/894496305/FinancialEngineer.7z) – dajood

+0

Spiacente, nessun link per il download del progetto, per favore. Per coinvolgere gli altri e renderli più attraenti per aiutare, pubblica un [SSCCE] (http://pscode.org/sscce.html). – pmoule

risposta

16

Prova questa:

Platform.setImplicitExit(false); 
4

Sperimentiamo lo stesso problema. Sulla base dei seguenti thread si assume che una volta che il pannello non è più visibile, la piattaforma JavaFX viene chiusa automaticamente poiché tutti gli elementi della GUI JavaFX non sono più visibili.

Questa ipotesi si basa su informazioni provenienti da:
https://forums.oracle.com/forums/thread.jspa?messageID=10287328 e
https://forums.oracle.com/forums/thread.jspa?threadID=2390971

Un primo tentativo nel nostro Environnment è quello di aggiungere un manichino JFXPanel in qualche parte del codice e lasciarlo lì fino vostre uscite di programma sembra funzionare .

seconda prova sul codice funziona anche:

/* 
* 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

Non avevo più speranza. Grazie mille, è davvero un grande aiuto per me. – dajood

+5

La vera soluzione dovrebbe essere in javaFX 2.2 Vedere http://javafx-jira.kenai.com/browse/RT-15011 Si dovrebbe usare Platform.setImplicitExit (boolean implicitExit). – Escay

1

sono rimasto bloccato sullo stesso problema: Io ho il problema non solo con il componente superiore. .. ma anche con le finestre di dialogo modali. Su alcuni sistemi operativi sembrano funzionare all'inizio (Windows) su altri i dialoghi iniziano come caselle nere e vuote (linux). In alcune finestre di dialogo (sotto Windows) mentre si lavora con la finestra di dialogo (in genere dopo aver fatto clic sui pulsanti) la finestra di dialogo diventa vuota (in genere dopo il sesto clic o così ???). Quando si sposta il mouse (senza fare clic) sui pulsanti riappaiono (ma non il resto)

Ho anche l'effetto (almeno in Windows) che la riduzione e il ripristino della finestra principale risulta in una finestra vuota.

Ma: (!!!!!) Ho scoperto che ridimensionare la finestra principale o le finestre di dialogo con il mouse riporta il contenuto !!!! Quindi presumo che la tua assunzione con la morte preliminare non possa essere la ragione (perché dovrebbe tornare in quel momento).

per i dialoghi ho trovato una soluzione: rendere la scena della finestra un membro della classe in modo da poter accedere in un secondo momento nel seguente repaint() metodo:

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

in una finestra di uso riverniciare () appena prima showModal() e alla fine di ogni evento del pulsante -> funziona bene :-) Ma non ho trovato un evento in cui posso chiamare repaint() dopo la minimizzazione per la finestra principale. Ora una nuova mistica, ma una soluzione: Se posiziono il repaint() appena prima di show() per la Finestra Principale, tutto funziona correttamente. Non ho idea del perché ...

Ma penso sicuramente che si tratta di un bug in JavaFX che si spera verrà risolto nella prossima versione.

migliori saluti

Ingo