2016-08-05 45 views
0

In meinem Projekt (mit dem Netbeans Platform und JavaFX), die von mehreren Tabs zusammengesetzt ist (alle von ihnen erstellt werden Subklassen die TopComponent Klasse) Ich versuche, ein anderes Register zu implementieren, die die zeigen sollen Bildschirm einer virtuellen Maschine, die bereits auf VirtualBox läuft.Netbeans Platform: Wie wird ein Frame anstelle einer TopComponent verwendet?

Das Problem ist, dass das Werkzeug benutze ich von einem Rahmen besteht (von Java AWT) als Top-Level-Container und natürlich, wenn ich versuche, es in meiner Top-Komponente hinzuzufügen, erhalte ich eine Ausnahme, weil Es ist nicht möglich, einen Container der obersten Ebene in einen anderen Container der obersten Ebene aufzunehmen.

Also, das ist meine Frage: ist es möglich, eine neue Komponente mit der NetBeans Platform zu erstellen, ohne die TopComponent-Klasse zu verwenden? Ich habe das bereits versucht, aber die neue Registerkarte erscheint nicht.

@TopComponent.Description(preferredID = "MyTopComponent", 
// iconBase="SET/PATH/TO/ICON/HERE", 
persistenceType = TopComponent.PERSISTENCE_ALWAYS) 
@TopComponent.Registration(mode = "editor", openAtStartup = true) 
@ActionReference(path = "Menu/Window" /* , position = 333 */) 
@TopComponent.OpenActionRegistration(displayName = "#CTL_MyAction", preferredID = "MyTopComponent") 
public class MyTopComponent extends TopComponent { 

/** 
    * Logging Facility Instance 
    */ 
private static final Logger LOG = LoggerFactory.getLogger(MyTopComponent.class); 

private JFXPanel fxPanel; 

private RDPClient rdpClient; 

private Frame rdpFrame; 

public MyTopComponent() { 
    initTopComponent(); 
    initFXComponent(); 
    setClientProperties(); 
} 

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


private void initTopComponent() { 
    setName(Bundle.CTL_MyTopComponent()); 
    setToolTipText(Bundle.HINT_MyTopComponent()); 
} 

private void setClientProperties() { 
    putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE); 
    putClientProperty(TopComponent.PROP_DRAGGING_DISABLED, Boolean.TRUE); 
    putClientProperty(TopComponent.PROP_MAXIMIZATION_DISABLED, Boolean.TRUE); 
    putClientProperty(TopComponent.PROP_UNDOCKING_DISABLED, Boolean.TRUE); 
} 

private void initFXComponent() { 

    try { 
    rdpClient = new RDPClient(); 
    } catch (RdesktopException ex) { 
    Exceptions.printStackTrace(ex); 
    } 

    setLayout(new BorderLayout()); 
    fxPanel = new JFXPanel(); 
    rdpFrame = rdpClient.getComponent(); 
    // fxPanel.add(rdpClient.getComponent()); 
    add(fxPanel, BorderLayout.CENTER); 

    Platform.setImplicitExit(false); 
} 

Wenn ich versuche, den Rahmen innerhalb des JFXPanel hinzuzufügen, wird eine Ausnahme ausgelöst. Das gleiche passiert, wenn ich versuche, es direkt im Container hinzuzufügen. Irgendwelche Vorschläge?

Antwort

0

Ein Frame ist per Definition eine Top-Level-Fensterkomponente. Frames können nicht innerhalb einer anderen Komponente platziert werden, andere Komponenten werden innerhalb von Frames platziert.

Wenn das Werkzeug nur einen Rahmen bereitstellt, ist es notwendigerweise ein eigenes Fenster. Das einzige, was Sie damit machen können, ist die Position, die Abmessungen, die Show und das Ausblenden, das Setzen des Titels und anderes Bildmaterial.