Eclipse RCP继承应用中,点击保存后如何关闭属性窗口?
解决Eclipse RCP属性窗口保存后关闭的问题
嘿,我来帮你搞定这个头疼的窗口关闭问题!在Eclipse RCP里,就算拿不到直接的"window"引用,也有好几种靠谱的方式能实现保存后自动关闭属性窗口,我给你梳理几个实用思路:
1. 利用PropertyPage的内置方法(最推荐)
如果你的属性窗口是基于Eclipse标准的PropertyPage实现的,那简直太方便了——PropertyPage本身就提供了performOk()方法,这个方法就是在用户点击"确定/保存"按钮时触发的。你只需要重写这个方法,做完数据库保存逻辑后,直接调用getShell().close()就能关闭窗口:
@Override protected boolean performOk() { // 第一步:执行你的数据库保存逻辑 saveDataToDatabase(); // 第二步:关闭当前属性窗口 getShell().close(); // 别忘了返回父类的执行结果 return super.performOk(); }
这里的getShell()会直接返回当前属性页所在的窗口容器,调用close()就能优雅关闭窗口。
2. 从控件向上追溯Shell
如果你的保存按钮是自定义的SWT控件(比如在自定义对话框里),可以从按钮本身向上找到它所在的Shell:
saveButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // 先执行保存逻辑 saveDataToDatabase(); // 从事件源获取按钮,再拿到对应的Shell Button sourceBtn = (Button) e.getSource(); Shell propertyShell = sourceBtn.getShell(); propertyShell.close(); } });
这种方式适合所有SWT控件场景,只要是窗口内的控件,都能通过getShell()拿到所在的窗口。
3. 通过Display获取当前活动窗口
如果上述两种方式都不适用,还可以通过Eclipse的Display类获取当前激活的Shell,不过这个要注意确保当前激活的确实是你的属性窗口,避免误关其他窗口:
// 获取当前显示的活动Shell Shell activeShell = Display.getCurrent().getActiveShell(); // 可以加个判断,比如通过窗口标题筛选 if ("我的属性窗口标题".equals(activeShell.getText())) { activeShell.close(); }
4. 自定义Dialog直接调用close()
如果你的属性窗口是继承自Eclipse的Dialog或TitleAreaDialog,那对话框本身就有close()方法,在保存完成后直接调用就行:
public class CustomPropertyDialog extends TitleAreaDialog { // 构造函数等初始化代码 @Override protected void createButtonsForButtonBar(Composite parent) { // 创建保存按钮 Button saveBtn = createButton(parent, IDialogConstants.OK_ID, "保存", true); saveBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { saveDataToDatabase(); // 直接关闭对话框 close(); } }); // 创建取消按钮 createButton(parent, IDialogConstants.CANCEL_ID, "取消", false); } }
小提醒
- 调用
close()会隐藏窗口并释放相关资源,大部分场景下直接用这个就够了;如果需要彻底销毁窗口资源,可以用dispose()。 - 如果是标准的属性视图页面,
performOk()默认可能会触发页面关闭,但有些自定义场景下可能不会,所以手动调用更稳妥。
内容的提问来源于stack exchange,提问作者Jaime Gonzalez
相关产品推荐
相关产品推荐

