0

我正在显示来自 JFrame 的对话框,但是当我在对话框外部单击时,对话框会被隐藏。除非你关闭它,否则对话框应该不会让你什么都不做?

这是我的代码:

从第一个对话框调用的对话框:

JProductStocking jps = JProductStocking.getProductStoking(JPanelTicket.this, oApp);
jps.setVisible(true);

这是 JDIalog 称为:

public class JProductStocking extends javax.swing.JDialog implements BeanFactoryApp{
public JProductStocking(Component parent, boolean modal) {
        //super(parent, modal);
        initComponents();

    }

public static JProductStocking getProductStoking(Component parent, AppView app) {
        Window window = getWindow(parent);

        JProductStocking myMsg;
        if (window instanceof JFrame) { 
            myMsg = new JProductStocking((Frame) window, true);
        } else {
            myMsg = new JProductStocking((Dialog) window, true);
        }
        myMsg.init(app, parent);
        myMsg.applyComponentOrientation(parent.getComponentOrientation());
        return myMsg;
    }

     private static Window getWindow(Component parent) {
        if (parent == null) {
            return new JFrame();
        } else if (parent instanceof JFrame || parent instanceof Dialog) {
            return (Window) parent;
        } else {
            return getWindow(parent.getParent());
        }
    }

    public void init(AppView app, Component parent) {
        oApp = app;
       // m_dlSales = (DataLogicSales) app.getBean("com.openbravo.pos.forms.DataLogicSales");
        initComponents();
        ProductList = new ArrayList();
        this.setResizable(false);
        setLocationRelativeTo(parent);

    }
}

我没有很好地调用 jDialog 吗?或者我做错了什么?

4

2 回答 2

3

您正在寻找的行为称为“模态”对话框。您必须将“true”传递给对话框构造函数:

public JProductStocking() {
        super((Frame)null, true); //better to pass an actual Frame, Window or Dialog object as a parent
        initComponents();

    }
于 2014-05-15T09:47:51.337 回答
2

您没有将父级Window和没有modal标志传递给JDialog' 的构造函数,因此使用了无模式的默认行为。请注意,除了您的代码不必要的复杂之外。

从 Java 6 开始,您可以将 a 传递Window给 aDialog的构造函数,并且它是允许的,null因此它是故障安全的。结合现有方法SwingUtilities.windowForComponent,整个代码可能如下所示:

public class JProductStocking extends javax.swing.JDialog
  implements BeanFactoryApp {

  public JProductStocking(Component parent, Dialog.ModalityType modality) {
    super(SwingUtilities.windowForComponent(parent), modality);
    initComponents();
  }
// …

请注意,在 Java 6 中Dialog.ModalityType,您可以将 a 配置Dialog为阻止除此对话框的子项之外的所有其他应用程序窗口 ( APPLICATION_MODAL) 或仅阻止对话框的父项及其子项 ( DOCUMENT_MODAL)。这提供了比简单modal标志更多的控制。

于 2014-05-15T11:01:33.533 回答