为什么要消除TopComponent上的JavaFX内容?

daj*_*ood 12 java javafx netbeans-platform netbeans-7 javafx-2

我有一个问题,可能是由于缺乏对Netbeans平台(7.1.2)或JavaFX 2的一些原则的理解造成的.我想添加JFXPanel一个非常简单Scene的Swing JPanel,它是一个孩子的的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);



}
Run Code Online (Sandbox Code Playgroud)

这个编译没有问题,Button当我TopComponent第一次显示时会显示JavaFX .但是只要组件被隐藏并再次显示,JavaFX就会Button消失,而其他子项仍然可见.

为什么JavaFX内容会消失?

编辑:

我现在包括整个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
}
}
Run Code Online (Sandbox Code Playgroud)

在我的例子中,这TopComponent是一个名为AccountExplorer的组件的一部分,它引用JavaFX并由普通的NB平台应用程序引用.

小智 20

试试这个:

Platform.setImplicitExit(false);
Run Code Online (Sandbox Code Playgroud)