2012-05-16 3 views
11

Ich habe ein Problem, das vielleicht durch einen Mangel an Verständnis in einigen Prinzipien, ob die Netbeans Platform (7.1.2) oder JavaFX verursacht wird 2. Ich JPanel ein JFXPanel mit einem sehr einfachen Scene zu einem Schwingen hinzufügen wollte, dass ist ein Kind einer TopComponent. Ich erreichte dies durch den folgenden Code:Warum verschwindet der JavaFX-Inhalt auf meiner 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); 



} 

Dies kompiliert, ohne ein Problem und ein JavaFX Button angezeigt wird, wenn ich die TopComponent zum ersten Mal zeigen. Sobald die Komponente jedoch ausgeblendet und wieder angezeigt wird, verschwindet JavaFX Button, während die anderen untergeordneten Elemente noch sichtbar sind.

Warum verschwinden die JavaFX-Inhalte?

Edit:

ich nun auch die Quelle des ganzen TopComponent. Ich schätze, das ist alles, was du brauchst, um es selbst zu testen. Ich habe keine andere Datei geändert.

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

In meinem Fall ist dies TopComponent Teil einer Komponente AccountExplorer genannt, die JavaFX verweist und wird von einem einfachen NB Plattform Anwendungs ​​verwiesen.

+0

Ich habe versucht, das Problem mit Netbeans 7.1 und JavaFX 2.1 zu reproduzieren. Alle Komponenten erscheinen wieder wie erwartet. Bitte geben Sie einen SSCCE ein. – pmoule

+0

Danke für die Mühe. Sehen Sie mein Projekt [hier] (https://rapidshare.com/files/894496305/FinancialEngineer.7z) – dajood

+0

Sorry, keine Projekt-Download-Links, bitte. Um andere einzubinden und sie attraktiver zu machen, schreiben Sie eine [SSCCE] (http://pscode.org/sscce.html). – pmoule

Antwort

16

Try this:

Platform.setImplicitExit(false); 
4

Wir erleben das gleiche Problem. Auf der Grundlage der folgenden Threads gehen wir davon aus, dass die JavaFX Platform automatisch beendet wird, sobald das Panel nicht mehr sichtbar ist, da alle JavaFX-GUI-Elemente nicht mehr sichtbar sind.

auf Informationen Diese Annahme basiert aus:
https://forums.oracle.com/forums/thread.jspa?messageID=10287328 und
https://forums.oracle.com/forums/thread.jspa?threadID=2390971

Ein erster Versuch in unserem environnment einen Dummy JFXPanel irgendwo im Code hinzuzufügen ist und es dort zu lassen, bis Ihr Programm beendet scheint zu funktionieren .

zweiter Versuch auf dem Code funktioniert auch:

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

hatte ich keine Hoffnung mehr. Vielen Dank, das ist wirklich eine große Hilfe für mich. – dajood

+5

Der eigentliche Fix sollte in javaFX 2.2 sein. Siehe http://javafx-jira.kenai.com/browse/RT-15011. Man sollte Platform.setImplicitExit (boolean implicitExit) verwenden. – Escay

1

ich auf dem gleiche Problem stecken geblieben: Ich habe das Problem nicht nur mit der Top-Komponente. .. aber auch mit meinen modalen Dialogfenstern. Auf einigen Betriebssystemen scheinen sie zuerst zu funktionieren (Windows) auf anderen, die Dialoge beginnen als schwarze, leere Boxen (linux). In einigen Dialogen (unter Windows) während der Arbeit mit dem Dialog (typischerweise nach dem Anklicken von Buttons) wird der Dialog ebenfalls leer (typischerweise nach dem sechsten Klick oder so ???). Beim Bewegen der Maus (ohne zu klicken) über die Tasten erscheinen sie wieder (aber nicht der Rest)

Ich habe auch die Wirkung (zumindest unter Windows), die Minimierung und Wiederherstellung des Hauptfensters führt zu einem leeren Fenster.

Aber: (!!!!!) Ich fand heraus, dass das Hauptfenster oder die Dialoge mit der Maus Ändern der Größe der Inhalte zurück bringt !!!! Also ich nehme an, dass deine Annahme mit vorläufigem Tod nicht der Grund sein kann (warum sollte es dann zurückkommen).

Für die Dialoge fand ich eine Lösung: Sprechen Sie die Szene des Fensters ein Klassenmitglied, so können Sie es später in der folgenden repaint zugreifen() -Methode:

/** 
    * 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 einem Dialog verwende ich repaint () kurz vor showModal() und am Ende jedes Button-Ereignisses -> klappt gut :-) Aber ich habe kein Event gefunden wo ich Repaint() nach Minimierung für das Hauptfenster aufrufen kann. Jetzt eine neue mystische aber eine Lösung: Wenn ich repaint() kurz vor show() für das MainWindow platzieren, funktioniert alles gut. Ich habe keine Ahnung, warum ...

Aber ich denke definitiv, es ist alles über einen Fehler in JavaFX, der hoffentlich in der nächsten Version behoben wird.

Mit freundlichen Grüßen

Ingo

Verwandte Themen