Java — setVisible(true)

#java #swing

#java #swing

Вопрос:

Я создал простой JDialog, который содержит метку и кнопку, в основном это эквивалент информационного диалога. Итак, в диалоговом окне есть метод display(), в котором я вызвал setVisible(true) пять раз.

Насколько мне известно, при вызове этого метода отображения он должен отображать диалоговое окно только один раз, но на самом деле он создал 5 диалоговых окон, почему он создал 5 диалоговых окон?

Редактирование 1: моя проблема больше похожа на это :

 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("Hello5");
    }
}

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)
        {
            l.setText(str);
            dg.setVisible(true);

        }
  } 
}
  

Edit2: теперь подобная ситуация возникает в моей программе, и вместо того, чтобы отображать диалоговое окно 5 раз, я хочу, чтобы оно отображало последнее, что я могу сделать для достижения этой цели?

Комментарии:

1. И куда вы звоните display(String str) ??

2. @Antoniossss Просто создайте объект и вызовите его со строкой по вашему выбору. В моей программе я только что добавил новый JMenuItem, и display(String str) вызывается всякий раз, когда на него нажимают.

3. Но это ваш пример, который не работает, поэтому укажите в своем коде, что это зависит от f переменной (возможно, JFrame), так что кто знает, что вы могли бы там сломать.

4. Почему вы вызываете setVisible() пять раз? Что вы ожидаете от этого?

Ответ №1:

Хорошо, в основном он не отображается сразу 5 раз, только он отображается 5 раз подряд.

JDialog.setVisible(true) является блокирующей операцией и блокируется до тех пор, пока диалоговое окно не будет закрыто.

Итак, появляется одно диалоговое окно, и приложение блокируется setVisible(true) при его закрытии, serVisible(true) вызывается другое и так далее.

Комментарии:

1. Хорошо, я понимаю, что вы говорите. Теперь я застрял в ситуации, более похожей на эту :

2. @KaranNagpal вы не вставили ссылку. В любом случае, поскольку это полностью соответствует вашему вопросу, отметьте его как принятый и опубликуйте еще один. Я попытаюсь помочь там.

3. я отредактировал вопрос, который лучше объясняет мою ситуацию @Antoniosssss

Ответ №2:

Вы создаете только один экземпляр диалогового окна с

 dg = new JDialog(f,"Alert!",true);
  

Затем вы показываете это же диалоговое окно пять раз с несколькими вызовами setVisible(true) .

Ответ №3:

Что касается вашего редактирования: в чем тогда ваша проблема?

Изменить

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

Для

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

Комментарии:

1. В моей основной программе есть 4 внутренних фрейма, каждый из которых содержит этот информационный диалог более 4 раз. Эти внутренние фреймы взаимосвязаны, поэтому иногда возникает ситуация, при которой эта функция вызывается более 8 раз . Поэтому я хочу, чтобы он отображался только один раз, а не 8 диалоговых окон. @Antoniosssss

2. Либо опубликуйте код, который на самом деле отражает то, что происходит в вашей ситуации, и для чего вы ищете решение, либо прекратите поиск помощи здесь. Решение проблемы, которое вы предоставили (даже с демонстрационным кодом!) Заключается в том, чтобы не вызывать display несколько раз один за другим. Какое отношение этот пример имеет к вашему приложению, никто не знает, и я думаю, что вы этого тоже не знаете. Вы только думаете, что это то же самое, что и ваша проблема, но на 99% это не так.

3. Код приложения состоит из 1000 строк, и такая ситуация возникает при очень специфическом вводе. Мне просто нужно знать, что я должен делать, чтобы всякий раз, когда вызывается display(String str), если диалоговое окно уже открыто, оно закрывается.

4. if(dialog.isVisible) dialog.setVisible(false) ?? Это не то, что вы задали в вопросе. Опять же, примите и отправьте новый, более точный вопрос.

5. Изменил метод на это публичное отображение пустоты (строка str) { if(dg.isVisible()) dg.setVisible(false); l.setText(str); dg.setVisible(true); } но все равно появляется 5 диалоговых окон