当另一个Dialog打开时,不要返回Dialog

时间:2014-05-15 09:36:11

标签: java swing parent jdialog modality

我从JFrame中显示一个Dialog,但是当我在对话框外单击时,对话框会被隐藏。除非你关闭它,否则它应该让对话不会让你无所作为?

这是我的代码:

来自First Dialog的Dialog:

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?或者我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

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

    }

答案 1 :(得分:2)

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

从Java 6开始,您可以将Window传递给Dialog的构造函数,并且允许它为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,您可以配置Dialog以阻止此对话框(APPLICATION_MODAL)的子项以外的所有其他应用程序窗口,或阻止对话框的父项及其仅限儿童(DOCUMENT_MODAL)。这提供了比简单modal标志更多的控制。