#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 диалоговых окон