防止出现多个DialogBox

时间:2016-09-30 21:10:38

标签: java swing

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

class Demo implements ActionListener

{
    JFrame f;

    JButton b;
 DisplayDialog dialog;
public Demo() 
{
    f = new JFrame();
    f.setSize(200,200);

    b = new JButton("Click me");

    f.add(b);
    dialog = new DisplayDialog();

    b.addActionListener(this);
    f.setVisible(true);
}

public void actionPerformed(ActionEvent e)
{
    Object o = e.getSource();

    if(o==b)
    {
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello");
    }
}

public static void main(String args[])
{
    Demo d = new Demo();
}

class DisplayDialog implements ActionListener
{
        JDialog dg;
        JLabel l;
        JButton b;
        Font myfont;

        public DisplayDialog()
        {
            dg = new JDialog(f,"Alert!",true);
            dg.setSize(300,150);
            l = new JLabel("Message");
            b = new JButton("OK");

            myfont = new Font("Serif",Font.BOLD,12);
            l.setFont(myfont);

            dg.add(l);
            dg.add(b,"South");

            dg.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

            b.addActionListener(this);
        }

        public void actionPerformed(ActionEvent e)
        {
            Object o = e.getSource();
            if(o==b)
            {
                dg.setVisible(false);
            }
        }

        public void display(String str)
        {
            if(dg.isVisible())
                dg.setVisible(false);
            l.setText(str);
            dg.setVisible(true);

        }

}
}

单击该按钮时,将出现5对话框。现在我想在DisplayDialog类中进行这样的更改,以便每次调用显示方法时,先前打开的对话框都会关闭,而最新的对话框是唯一可见的对话框。

我试过这样做:

public void display(String str)
        {
            if(dg.isVisible())
                dg.setVisible(false);
            l.setText(str);
            dg.setVisible(true);

        }

但它没有做任何事情。 此外,即使只有一个对象实例,我也会惊讶地看到多个对话框出现。根据我的理解,如果对话框已经可见,setVisible(true)不应该做任何事情。

这种情况对我来说非常混乱。

1 个答案:

答案 0 :(得分:0)

问题是你无法在单个线程中执行此操作(就像您在演示中预先设置的那样) - setVisible将始终阻止(等待对话框关闭)并且另一个display调用将不会调用到那时。

尝试在多帧环境中运行它(就像你已声明你的应用程序一样)但是将display更改为

public void display(String str){            
            l.setText(str);
            if(dg.isVisible()){
                dg.setVisible(true);
            }
        }

如果此对话框已经可见,则不会显示该对话框,但会更改文本。它的工作条件是,不是像演示一样对display进行连续调用,而是来自不同的线程。没有别的办法了。 setVisible会阻止。