2016-09-30 79 views
0
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)不應該做任何事情。

這整個情況對我來說很混亂。

+0

我更正了這個問題,通過使用JFrame而不是JDialog,但我不明白爲什麼在jdialog中生成多個對話框,但這不會出現在jframe中。 –

回答

0

的事情是,你不能在單個線程做到這一點(就像你在你的演示preseting吧) - setVisible永遠阻止(等到對話框關閉),而另一個display通話不會被調用到那時。

嘗試在多幀ENV運行它(像你說自己的應用),但改變display

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

,如果它已經可見將不顯示這樣的對話框,但文字會改變。它的工作條件是,這不是像在演示中一樣被調用display,而是來自不同的線程。沒有其他辦法。 setVisible將alwys塊。

相關問題