有一个相关的question已经回答了,但是从那时起使用注释已经发生了很多变化。
我正在使用注释注册TopComponents。例如:
WindowManager.getDefault().invokeWhenUIReady(() -> {
WindowManager.getDefault().getRegistry().getOpened().stream()
.forEach((tc) -> {
tc.close();
});
TopComponentGroup group
= WindowManager.getDefault()
.findTopComponentGroup("Test Role");
if (group != null) {
group.open();
}
});
后来我尝试打开这样的小组作为测试:
var x = document.createElement("IMG");
x.setAttribute("src", deck[randomNumber].location);
x.setAttribute("alt", deck[randomNumber].name);
x.style.margin = "0.5%";
x.style.border = "5px solid transparent";
x.style.borderRadius = "10px";
document.body.appendChild(x);
x.onclick = function() {
if (this.style.border === "5px solid gold")
{this.style.borderColor = "transparent";
var index = answers.indexOf(this.alt);
answers.splice(index, 1);
} else {this.style.border = "5px solid gold";
this.style.borderRadius = "10px";
answers.push(this.alt);
}
所有组件都已关闭,但没有任何内容打开。它不起作用,所以显然缺少一些管道。
这仍然是正确的做法吗?
这个地方有一个有效的例子吗?
答案 0 :(得分:1)
以下是我如何能够让任何绊倒这个问题的人:
我创建了一个类,并根据此code注册为服务:
/**
* Based on code from: http://www.smartcode.ch/netbeans-hide-show-topcomponent/
*
* @author Javier A. Ortiz Bultrón javier.ortiz.78@gmail.com
*/
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.openide.util.Lookup;
import org.openide.util.lookup.ServiceProvider;
import org.openide.windows.Mode;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
@ServiceProvider(service = ViewManager.class)
public class ViewManager {
private final Map<TopComponent, Mode> hiddenComponents;
public ViewManager() {
hiddenComponents = new HashMap<>();
}
public synchronized void showTopComponent(Class<? extends TopComponent> topComponentClass) {
for (Map.Entry<TopComponent, Mode> hiddenComponentEntry : hiddenComponents.entrySet()) {
TopComponent hiddenComponent = hiddenComponentEntry.getKey();
if (hiddenComponent.getClass().equals(topComponentClass)) {
Mode mode = hiddenComponentEntry.getValue();
WindowManager.getDefault().findMode(mode.getName()).dockInto(hiddenComponent);
hiddenComponent.open();
hiddenComponents.remove(hiddenComponent);
break;
}
}
}
public synchronized void hideTopComponent(Class<? extends TopComponent> topComponentClass) {
Set<TopComponent> shownTopComponents = WindowManager.getDefault().getRegistry().getOpened();
for (TopComponent shownTopComponent : shownTopComponents) {
if (shownTopComponent.getClass().equals(topComponentClass)) {
Mode mode = WindowManager.getDefault().findMode(shownTopComponent);
hiddenComponents.put(shownTopComponent, mode);
shownTopComponent.close();
}
}
}
public synchronized void showAll() {
for (TopComponent tc : hiddenComponents.keySet()) {
showTopComponent(tc.getClass());
}
}
/**
* Load a screen role.
*
* @param role Role to load.
*/
public static void loadRole(String role) {
//Open all components
Lookup.getDefault().lookup(ViewManager.class).showAll();
//Change role (this closes the ones not in this role)
WindowManager.getDefault().setRole(role);
}
}
然后在模块安装程序中执行此操作:
@Override
public void restored() {
WindowManager.getDefault().invokeWhenUIReady(() -> {
/**
* All windows start opened. Populated the ViewManager. It is
* important to configure all TopComponents with:
* persistenceType = TopComponent.PERSISTENCE_NEVER or TopComponent.PERSISTENCE_ONLY_OPENED
* and openAtStartup = true
*/
ViewManager manager = Lookup.getDefault().lookup(ViewManager.class);
WindowManager.getDefault().getRegistry().getOpened().stream()
.forEach((tc) -> {
manager.hideTopComponent(tc.getClass());
});
manager.loadRole(Tool.LOBBY);
});
}
安装程序代码中记录的技巧是将所有模块标记为在启动时以正确的持久性类型打开。
这将打开应用程序启动时的所有窗口,隐藏它们(在ViewManager上注册它们),然后打开指定的角色。
角色,如文档here所示,执行以下操作:
此方法的默认实现执行以下操作:
另一种选择是覆盖WindowManager本身来完成所有这些,但我发现它太过侵入性和危险,因为某些方法受到保护,因此它无法包装WindowsManagerImpl(默认值)。也不可能只扩展WindowsManagerImpl,因为它的包是私有的。