2016-09-30 3 views
1

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

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

Edit1: Моя проблема больше похожа на это:

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 раз, я хочу, чтобы отобразить последний , что я могу сделать для этого?

+0

А где вы называете 'дисплей (String ул)' ?? – Antoniossss

+0

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

+0

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

ответ

4

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

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

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

+0

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

+0

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

+0

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

0

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

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

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

0

Что касается вашего редактирования: Что вы думаете об этом?

Изменить

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

в

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

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

+0

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

+0

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

Смежные вопросы