Swing:如何从控制器程序化地关闭JDialog?

3
我有一个JDialog通过bean绑定(Netbeans)与我的(独立的)控制器类绑定。我的对话框有一个“关闭”按钮。此按钮的操作属性绑定到我的控制器中的一个操作。
对话框:
public class AppVersionCheckDialog extends javax.swing.JDialog {
    ...
    binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, controller, org.jdesktop.beansbinding.ELProperty.create("${closeButtonActionListener}"), btnOk, org.jdesktop.beansbinding.BeanProperty.create("action"));
    bindingGroup.addBinding(binding);
    ...
}

所以基本上我得到了

public class AppVersionCheckDialogController extends AbstractController {

    private final Action closeAction = new AbstractAction("Close") {
        @Override
        public void actionPerformed(ActionEvent e) {
            // dialog.dispose() - no reference of dialog instance here 
        }
    };


    public Action getCloseButtonActionListener(){
        return closeAction;
    }
}

在我的控制器中。

我在控制器中没有对话框的任何引用。我也不想引入一个,因为它违反了将事物绑定在一起的整个原则。

那么如何关闭对话框?有没有一种方法可以将对话框实例绑定到我的控制器属性上?如果有,如何做?


对话框在哪里定义? - Mohammadreza Khatami
到目前为止还没有。我有两个类:对话框包含控制器作为bean,而控制器没有任何对话框的引用。 - gorootde
请发布您的代码。 - Mohammadreza Khatami
为什么你需要这个? - Mohammadreza Khatami
1
可能是如何使用Java代码真正关闭JDialog?的重复问题。 - xenteros
显示剩余4条评论
1个回答

7

我现在没有编译器,但如果我理解正确,你想要的与这个类似:

public void actionPerformed(ActionEvent e) {
        Component component = (Component) e.getSource();
        JDialog dialog = (JDialog) SwingUtilities.getRoot(component);
        dialog.dispose();
      }

如果有机会编译并且出现问题,我会看一下。我希望它能解决你的问题。


以上解决方案并不等同于点击关闭窗口按钮。它不会运行windowClosing(...)事件监听器。 - Queeg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接