2012-06-25 81 views
10

我有一個模態設置對話框,它是一個JDialog。在此設置窗口中,我將一些組件(包括按鈕)放置到另一個也是JDialog的模式設置對話框中。我讓他們JDialogs,因爲這是我知道做模態對話的唯一途徑。如何在另一個模態JDialog之上創建模態JDialog

問題是這樣的:當我創建主要設置對話框時,我必須構建JDialog,無需父框架或父框架。由於我的主窗口是一個JFrame,我可以將它傳遞給主設置對話框的構造函數。但是當我想要創建第二個應該將主設置對話框設置爲父級的模式設置對話框時,我找不到獲取JDialog的(J)Frame的方法。我希望將該主設置對話框作爲父對象傳遞,以便在顯示時將第二個設置對話框居中。讓我們假設第二個設置對話框沒有構造函數來傳遞一個位置,只是JDialog的構造函數。

有沒有辦法獲得JDialog的(J)框架? 我的設置是否存在設計缺陷,我是否應該使用其他設置對話框? (如果是的話,我應該怎麼做這些替代的設置對話框模態?)

感謝你的幫助, 埃裏克

UPDATE: 謝謝大家對你的答案。他們讓我明白,顯然,擁有一個JDialog的擁有者並不是絕對必要的。我認爲這是對話框需要能夠禁用所有者,直到對話框關閉,但顯然這種形式是獨立於所有者。我還注意到,即使有業主對話仍然沒有集中在業主,所以現在我的代碼是這樣的:

public class CustomDialog extends JDialog { 
    public CustomDialog(String title) { 
     setModal(true); 
     setResizable(false); 
     setTitle(title); 

     buildGUI(); 
    } 

    public Result showDialog(Window parent) { 
     setLocationRelativeTo(parent); 
     setVisible(true); 
     return getResult(); 
    } 
} 

這也使得在模態對話框模態對話框。

感謝您的幫助!

+0

我只想沒有使設置窗口對任何東西都是模態的。如果他們在設置窗口中工作時需要使用該應用程序,該怎麼辦?這對我來說似乎非常嚴格。 –

回答

13

不知道到底是什麼,你有一個問題,但這裏是你如何能有多個模式對話框的例子:

import java.awt.BorderLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestDialog { 

    protected static void initUI() { 
     JPanel pane = newPane("Label in frame"); 
     JFrame frame = new JFrame("Title"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(pane); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static JPanel newPane(String labelText) { 
     JPanel pane = new JPanel(new BorderLayout()); 
     pane.add(newLabel(labelText)); 
     pane.add(newButton("Open dialog"), BorderLayout.SOUTH); 
     return pane; 
    } 

    private static JButton newButton(String label) { 
     final JButton button = new JButton(label); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Window parentWindow = SwingUtilities.windowForComponent(button); 
       JDialog dialog = new JDialog(parentWindow); 
       dialog.setLocationRelativeTo(button); 
       dialog.setModal(true); 
       dialog.add(newPane("Label in dialog")); 
       dialog.pack(); 
       dialog.setVisible(true); 
      } 
     }); 
     return button; 
    } 

    private static JLabel newLabel(String label) { 
     JLabel l = new JLabel(label); 
     l.setFont(l.getFont().deriveFont(24.0f)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
+0

不錯,但爲什麼新的'JDialog'以樓梯的方式打開? – zygimantus

+1

@zygimantus這是直接由'dialog.setLocationRelativeTo(button)調用引起的' –

5

1.請閱讀The New Modality API in Java SE 6

2.Is有沒有辦法讓一個JDialog的(J)框架?

Window ancestor = SwingUtilities.getWindowAncestor(this); 

Window ancestor = (Window) this.getTopLevelAncestor();