Проблема с открытием NetBeans TopComponent при запуске

Я работаю над приложением платформы NetBeans и хочу автоматически открывать TopComponent при запуске приложения. Несмотря на выполнение типичных шагов, мой TopComponent не открывается при запуске.

Вот шаги, которые я выполнил:

  1. Создал TopComponent:

    package com.example.myapp;
    
    import org.openide.windows.TopComponent;
    import org.openide.awt.ActionID;
    import org.openide.awt.ActionReference;
    import org.openide.util.NbBundle.Messages;
    
    @TopComponent.Description(
            preferredID = "MyTopComponent",
            persistenceType = TopComponent.PERSISTENCE_ALWAYS
    )
    @TopComponent.Registration(
            mode = "editor",
            openAtStartup = false // I handle the opening manually
    )
    @ActionID(category = "Window", id = "com.example.myapp.MyTopComponent")
    @ActionReference(path = "Menu/Window", position = 0)
    @Messages({
        "CTL_MyTopComponent=My TopComponent",
        "HINT_MyTopComponent=This is a MyTopComponent window"
    })
    public final class MyTopComponent extends TopComponent {
    
        public MyTopComponent() {
            initComponents();
            setName(Bundle.CTL_MyTopComponent());
            setToolTipText(Bundle.HINT_MyTopComponent());
        }
    
        private void initComponents() {
            // Initialize your components here
        }
    
        public static synchronized MyTopComponent getInstance() {
            MyTopComponent instance = (MyTopComponent) WindowManager.getDefault().findTopComponent("MyTopComponent");
            if (instance == null) {
                instance = new MyTopComponent();
            }
            return instance;
        }
    } 
    
    
  2. Создал класс установщика для обработки логики запуска:

package com.example.myapp;

import org.openide.modules.ModuleInstall;
import org.openide.windows.WindowManager;

public class Installer extends ModuleInstall {

    @Override
    public void restored() {
        WindowManager.getDefault().invokeWhenUIReady(() -> {
            MyTopComponent tc = MyTopComponent.getInstance();
            if (tc != null) {
                tc.open();
                tc.requestActive();
            }
        });
    }
}
  1. Зарегистрировал класс Installer в файле манифеста.mf:
Manifest-Version: 1.0
OpenIDE-Module: com.example.myapp
OpenIDE-Module-Specification-Version: 1.0
OpenIDE-Module-Install: com/example/myapp/Installer.class

Несмотря на выполнение этих действий, TopComponent не открывается при запуске. Вот дополнительные сведения и шаги, которые я предпринял для устранения проблемы:

  • Проверено, что класс Installer правильно размещен в указанном пакете.
  • Проверены журналы NetBeans на наличие ошибок или предупреждений, связанных с TopComponent или установщиком (ничего не обнаружено).
  • Почистил и пересобрал модуль.
  • Попробовал запустить модуль в чистом виде. Каталог пользователя NetBeans.

Что может быть причиной того, что TopComponent не открывается при запуске и как решить эту проблему?

Любая помощь или предложения будут очень признательны.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использовать ModuleInstall/restored(), вероятно, слишком рано, пользовательский интерфейс Netbeans еще не готов.

Вместо этого попробуйте то же самое с @onShowing, чтобы ваш код вызывался, когда пользовательский интерфейс готов:

@onShowing
public class OpenStart implements Runnable {

    @Override
    public void run() {
        WindowManager.getDefault().invokeWhenUIReady(() -> {
            MyTopComponent tc = MyTopComponent.getInstance();
            if (tc != null) {
                tc.open();
                tc.requestActive();
            }
        });
    }
}

Я думаю, вам больше не нужно использовать WindowManager.getDefault().invokeWhenUIReady() в методе run().

jjazzboss 24.06.2024 14:24

Другие вопросы по теме