在构造函数中配置JDialog

时间:2014-09-08 04:14:41

标签: java swing

我有一个条件,条件通过,我将展示一个JDialog。如果失败,我只需要显示一个JOption窗格并处理JDialog。 EX。我必须在按钮上单击显示对话框,

import javax.swing.JDialog;
import javax.swing.JLabel;

public class MyDialog extends JDialog {
public MyDialog(String name){
    JLabel welcomeLable = new JLabel("Hi welcome");
    add(welcomeLable);
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    setSize(100, 100);
    if(name.equals("pass")){
        //Do nothing
    }else{
        dispose();
    }
}

public static void main(String[] d){
    MyDialog dialog = new  MyDialog("fail");
    dialog.setModal(true);
    dialog.show();
}
}

显示消息框并显示验证消息,但仍显示对话框。怎么解决这个问题。 怎么解决这个问题。

4 个答案:

答案 0 :(得分:1)

将您的逻辑与对话框分开。你的对话框不应该决定它是否应该被显示,这不是它的工作。让你的代码这样做......

public class MyDialog extends JDialog {
    public MyDialog(String name){
        JLabel welcomeLable = new JLabel("Hi welcome");
        add(welcomeLable);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setSize(100, 100);
    }

    public static void main(String[] d){
        if(name.equals("pass")){
            MyDialog dialog = new  MyDialog("fail");
            dialog.setModal(true);
            dialog.show();
        }
    }
}

我还建议您考虑查看JOptionPane,这可以大大减少您可能需要使用的重复代码量。

有关详细信息,请查看How to Make Dialogs

答案 1 :(得分:0)

猜测你的电话应该是super.dispose(); 因为还要指示要使用它的dispose方法准备好使用它的dispose方法的Window类(通过调用super();作为类中构造函数的第一行。 另外,因为它可能是在层次结构中爬行以在JDialog扩展的Window类中找到它,所以它可能在范围上有点屏蔽。

答案 2 :(得分:0)

如果不改变逻辑(和代码),就不可能得到你想要的东西。 在main方法中,#show()方法在构造函数结束之后被称为 ,因此之后<{strong>方法。

这只是第一个问题(在#dispose()之前调用#dispose()),第二个问题是,即使你设法以某种方式处理/关闭对话框,你也可以调用#show()将有一个闪烁,因为对话框将会显示,并在下一刻隐藏。

此致

答案 3 :(得分:0)

首先关闭:show()现已弃用。而是使用pack()后跟setVisible(true)

关于您的问题:问题是即使已经处理了对话框,仍然可以显示/设置对话框。从逻辑的角度来看,这可能没有意义,但这就是实现的行为方式。通过让构造函数设置main方法将对其做出反应的标志,我将完成您要做的事情。像这样:

import javax.swing.JDialog;
import javax.swing.JLabel;

public class MyDialog extends JDialog {

private boolean showMe;

public MyDialog(String name){
    JLabel welcomeLable = new JLabel("Hi welcome");
    add(welcomeLable);
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    setSize(100, 100);
    showMe = name.equals("pass");
}

public boolean getShowMe(){
    return showMe;
}

public static void main(String[] d){
    MyDialog dialog = new  MyDialog("fail");
    dialog.setModal(true);
    if (dialog.getShowMe()){
        dialog.pack();
        dialog.setVisible(true);
    }else{
        dialog.dispose();
    }
}
}