Запретить отображение более одного диалогового окна

#java #swing

#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. Я исправил эту проблему, используя JFrame вместо JDialog, но я не понимаю, почему в jdialog создается несколько диалоговых окон, но в jframe этого не происходит.

Ответ №1:

Дело в том, что вы не можете сделать это в одном потоке (например, вы предварительно настраиваете его в своей демонстрации) — setVisible всегда будет блокироваться (подождите, пока диалоговое окно не закроется), и display до этого не будет вызван другой вызов.

Попробуйте запустить его в многокадровом env (как вы заявили, что ваше приложение), но измените display на

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

Таким образом, диалоговое окно не будет отображаться, если оно уже видно, но текст будет изменен. Условием для его работы является то, что это не последовательные вызовы display , подобные в demo, но из разных потоков. Другого пути нет. setVisible всегда будет блокироваться.