Я работаю над приложением платформы NetBeans и хочу автоматически открывать TopComponent при запуске приложения. Несмотря на выполнение типичных шагов, мой TopComponent не открывается при запуске.
Вот шаги, которые я выполнил:
Создал 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;
}
}
Создал класс установщика для обработки логики запуска:
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();
}
});
}
}
Manifest-Version: 1.0
OpenIDE-Module: com.example.myapp
OpenIDE-Module-Specification-Version: 1.0
OpenIDE-Module-Install: com/example/myapp/Installer.class
Несмотря на выполнение этих действий, TopComponent не открывается при запуске. Вот дополнительные сведения и шаги, которые я предпринял для устранения проблемы:
Что может быть причиной того, что TopComponent не открывается при запуске и как решить эту проблему?
Любая помощь или предложения будут очень признательны.
Использовать 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().