2012-05-16 13 views
11

मैं एक समस्या यह है कि हो सकता है की मौसम Netbeans मंच (7.1.2) या JavaFX 2. मैं एक स्विंग JPanel लिए एक बहुत ही सरल Scene के साथ एक JFXPanel जोड़ना चाहते थे कुछ सिद्धांत में समझ की कमी के कारण होता है मिल गया है कि एक टॉपकंपोनेंट का बच्चा है। मैं निम्नलिखित कोड कर यह उपलब्धि हासिल:क्यों मेरे TopComponent पर JavaFX सामग्री गायब हो जाती है?

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); 



} 

यह एक समस्या है और एक JavaFX Button प्रदर्शित किया जाता है बिना संकलित जब मैं पहली बार TopComponent दिखा। लेकिन जैसे ही घटक छिपा हुआ है और फिर दिखाया गया है, जावाएफएक्स Button गायब हो जाता है जबकि अन्य बच्चे अभी भी दिखाई दे रहे हैं।

जावाएफएक्स सामग्री गायब क्यों होती है?

संपादित करें:

मैं अब पूरी TopComponent के स्रोत शामिल हैं। मुझे लगता है कि आपको इसे अपने लिए परीक्षण करने की ज़रूरत है। मैंने कोई अन्य फाइल नहीं बदली।

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

मेरे मामले में, इस TopComponent एक घटक JavaFX का संदर्भ और एक सादे नायब प्लेटफार्म आवेदन द्वारा संदर्भित है जो AccountExplorer कहा जाता है का हिस्सा है।

+0

मैं NetBeans 7.1 और JavaFX 2.1 उपयोग करके अपनी समस्या पुन: पेश करने की कोशिश की। अपेक्षित के रूप में सभी घटक फिर से दिखाई देते हैं। कृपया एक एसएससीसीई पोस्ट करें। – pmoule

+0

प्रयास के लिए धन्यवाद। मेरी परियोजना देखें [यहां] (https://rapidshare.com/files/894496305/FinancialEngineer.7z) – dajood

+0

क्षमा करें, कोई परियोजना डाउनलोड लिंक नहीं है, कृपया। दूसरों को शामिल करने और इसे मदद करने के लिए और अधिक आकर्षक बनाने के लिए, एक [एसएससीसीई] (http://pscode.org/sscce.html) पोस्ट करें। – pmoule

उत्तर

16

इस प्रयास करें:

Platform.setImplicitExit(false); 
4

हम एक ही समस्या का अनुभव करते हैं। निम्नलिखित धागे के आधार पर हम मानते हैं कि एक बार जब पैनल अब दिखाई नहीं दे रहा है तो जावाएफएक्स प्लेटफार्म स्वचालित रूप से बाहर निकलता है क्योंकि सभी जावाएफएक्स गुई तत्व अब और दिखाई नहीं दे रहे हैं।
https://forums.oracle.com/forums/thread.jspa?messageID=10287328 और
https://forums.oracle.com/forums/thread.jspa?threadID=2390971

हमारे environnment में एक पहली कोशिश कोड में कहीं एक डमी JFXPanel जोड़ सकते हैं और यह वहाँ जाने के लिए तक अपने कार्यक्रम से बाहर निकलता है काम करने के लिए लगता है:

यह धारणा से जानकारी पर आधारित है ।

अपने कोड पर दूसरा प्रयास भी काम करता है:

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

मुझे अब और कोई उम्मीद नहीं थी। बहुत बहुत धन्यवाद, यह वास्तव में मेरे लिए एक बड़ी मदद है। – dajood

+5

वास्तविक फिक्स javaFX 2.2 में होना चाहिए http://javafx-jira.kenai.com/browse/RT-15011 देखें Platform.setImplicitExit (बूलियन implicitExit) का उपयोग करना चाहिए। – Escay

1

मैं एक ही समस्या पर अटक गया: मैं शीर्ष घटक के साथ न केवल समस्या है। .. लेकिन मेरे मोडल संवाद विंडोज़ के साथ भी। कुछ ओएस पर वे दूसरों पर पहले (विंडोज़) पर काम करते प्रतीत होते हैं, संवाद एक काले, खाली बक्से (लिनक्स) के रूप में शुरू होते हैं। संवाद के साथ काम करते समय कुछ संवाद (विंडोज़ के तहत) (आमतौर पर बटन क्लिक करने के बाद) संवाद भी खाली हो जाता है (आमतौर पर छठे क्लिक या तो ???) के बाद। बटनों पर माउस (बिना क्लिक किए) को स्थानांतरित करते समय वे फिर से दिखाई देते हैं (लेकिन बाकी नहीं)

मेरे पास प्रभाव भी है (कम से कम विंडोज़ के नीचे) जो मुख्य विंडो परिणामों को खाली विंडो में कम करके और बहाल करता है।

लेकिन: (!!!!!) मुझे पता चला कि मुख्य विंडो का आकार बदलना या माउस के साथ संवाद सामग्री वापस लाता है !!!! तो मुझे लगता है कि प्रारंभिक मृत्यु के साथ आपकी धारणा कारण नहीं हो सकती है (यह तब वापस क्यों आना चाहिए)। खिड़की के दृश्य बनाओ एक वर्ग के सदस्य आप निम्नलिखित रीपेंट में बाद में इसे का उपयोग कर सकते हैं ताकि() विधि:

संवाद के लिए मैं एक समाधान पाया

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

एक संवाद में मैं रीपेंट का उपयोग करें () showModal() से पहले और प्रत्येक बटन ईवेंट के अंत में -> ठीक काम करता है :-) लेकिन मुझे एक ऐसी घटना नहीं मिली है जहां मैं मुख्य विंडो के लिए न्यूनतमकरण के बाद repaint() को कॉल कर सकता हूं। अब एक नया रहस्यमय लेकिन समाधान: यदि मैं मेनविंडो के लिए शो() से पहले repaint() रखता हूं तो यह सब ठीक काम करता है। मुझे नहीं पता कि क्यों ...

लेकिन मुझे निश्चित रूप से लगता है कि यह जावाएफएक्स में एक बग के बारे में है जो उम्मीद है कि अगले संस्करण में निश्चित रूप से तय किया जाएगा।

सादर

इंगो

संबंधित मुद्दे

 संबंधित मुद्दे