Платформа Netbeans: как использовать фрейм вместо TopComponent?

В моем проекте (с платформой Netbeans и JavaFX), который состоит из нескольких вкладок (все они созданы в подклассе класса TopComponent) Я пытаюсь реализовать еще одну вкладку, которая должна отображать экран виртуальной машины, уже работающей в VirtualBox.

Проблема в том, что инструмент, который я использую, состоит из Frame (из Java awt) в качестве контейнера верхнего уровня, и, естественно, если я попытаюсь добавить его в свой верхний компонент, я получаю исключение потому что невозможно включить контейнер верхнего уровня в другой контейнер верхнего уровня.

Итак, вот мой вопрос: возможно ли создать новый компонент с платформой NetBeans без использования класса TopComponent? Я уже пытался это сделать, но новая вкладка не появляется.

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

Если я попытаюсь добавить фрейм внутри JFXPanel, это вызовет исключение. То же самое произойдет, если я попытаюсь добавить его прямо в контейнер. Какие-либо предложения?


person db92    schedule 05.08.2016    source источник


Ответы (1)


Фрейм по определению является компонентом окна верхнего уровня. Фреймы нельзя размещать внутри другого компонента, другие компоненты размещаются внутри фреймов.

Если инструмент предоставляет только рамку, это обязательно будет собственное окно. Единственное, что вы можете сделать с ним, это установить его местоположение, размеры, показать и скрыть его, установить заголовок и другие рамочные вещи.

person xski    schedule 29.08.2016