2011-10-21 40 views
4

鑑於以下小程序:Java:JOptionPane會影響父JFrame? (包括SSCCE)

import java.awt.BorderLayout; 
import java.awt.Rectangle; 
import java.lang.reflect.InvocationTargetException; 

import javax.swing.JApplet; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class Example extends JApplet 
{ 
    JPanel aPanel; 

    @Override 
    public void init() 
    { 
     try 
     { 
     javax.swing.SwingUtilities.invokeAndWait(new Runnable() 
     { 
      public void run() 
      { 
       makeGui(); 
      } 
     }); 
     } 
     catch (InterruptedException e) 
     { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     catch (InvocationTargetException e) 
     { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     }  
    } 

    public void makeGui() 
    { 
     aPanel = new JPanel(new BorderLayout()); 

     this.getContentPane().add(aPanel, BorderLayout.CENTER); 

     JFrame aTestFrame =new JFrame(); 
     aTestFrame.setBounds(new Rectangle(200,200)); 
     JPanel aTestPanel = new JPanel(new BorderLayout()); 
     aTestPanel.setBounds(new Rectangle(200,200)); 

     aTestFrame.add(aTestPanel); 
     aTestFrame.setVisible(true); 
     JOptionPane.showMessageDialog(aTestFrame, "arfarf"); 


    } 

} 

爲什麼JOptionPane的通話將關閉aTestFrame?如果我忽略了這個調用,2個框架可以正確顯示,但是當我點擊JOptionPane中的OK時,父JFrame就關閉了。

第一個答案是正確的,顯然有一個焦點問題..謝謝!

+2

這並不在我的機器上發生(的Java 6,Windows 7,Eclipse Indigo)。但是,當我在我的機器上單擊「確定」時,Applet窗口會獲得焦點並遮擋aFrame。 –

+0

同S.L. Barth – Mob

+0

通過「第一個答案」 - 你的意思是我的答案或S.L. Barth的評論?你認爲「焦點問題」是什麼意思,因爲我認爲這不是什麼問題。您正試圖從現有的頂層窗口打開第二個頂層窗口,並且應該使用JDialog來實現此目的,以便兩個窗口相關,因此顯示的z順序將是正確的。 –

回答

2

我認爲你關閉不使用一個JFrame與JApplet的,而是使用被紮成JApplet的的Window祖先的一個JDialog更好:

public void makeGui() { 
     aPanel = new JPanel(new BorderLayout()); 

     this.getContentPane().add(aPanel, BorderLayout.CENTER); 

     Window win = SwingUtilities.getWindowAncestor(Example.this); 

     JDialog dialog = new JDialog(win, "My Dialog", ModalityType.MODELESS); 

     JPanel dialogPanel = new JPanel(); 
     dialogPanel.setPreferredSize(new Dimension(200, 200)); 
     dialog.add(dialogPanel); 
     dialog.pack(); 
     dialog.setVisible(true); 

     JOptionPane.showMessageDialog(dialog, "arfarf"); 
    }