2012-06-25 17 views
10

Bir JDialog olan bir modal ayarları iletişim var. Bu ayar penceresinde, bir düğme de dahil olmak üzere, bir JDialog olan bir başka mod ayarları diyaloğuna bazı bileşenler yerleştirdim. Onları JDialog'lar yaptım çünkü modal bir diyalog yapmak için bildiğim tek yol bu.Modal JDialog başka bir modal JDialog üzerinde nasıl oluşturulur

Sorun şu: ana ayarlar iletişim kutusunu oluşturduğumda, JDialog'u ya ana Çerçeve olmadan veya ana Çerçeve ile yapılandırmam gerekiyor. Ana pencerem bir JFrame olduğundan, bunu ana ayar iletişim kurucusuna iletebilirim. Ancak, ana ayar diyaloğu bir ebeveyn olarak olması gereken ikinci modal ayar diyaloğunu oluşturmak istediğimde, JDialog'un (J) Frame'ini elde etmenin bir yolunu bulamıyorum. Ana ayarlar diyalog penceresini bir ebeveyn olarak iletmek istiyorum, böylece ikinci ayar diyaloğu gösterildiğinde üzerinde durur. İkinci ayar diyaloğunun bir konumu, sadece JDialog'un kurucularını geçmek için kurucusu olmadığını varsayalım.

JDialog'un (J) Çerçevesini almanın bir yolu var mı? Kurulumumda bir tasarım hatası var mı ve bu ayarlar iletişim kutuları için başka bir şey kullanmalı mıyım? (Ve eğer öyleyse, nasıl bu alternatif ayarları diyaloglar kalıcı yapın gerekir?)

Yardımlarınız için teşekkür ederim, Erik

GÜNCELLEME: cevaplar için teşekkür ederiz. Görünüşe göre, JDialog için bir sahip olmak kesinlikle gerekli değil. Diyaloğun diyaloğu kapanıncaya kadar devre dışı bırakabilmesi için bunun gerekli olduğunu düşündüm, fakat görünüşe göre modalite sahibinden bağımsız. Bu aynı zamanda kalıcı diyaloglar içinde kalıcı diyaloglar verir

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(); 
    } 
} 

: Ben de bile sahibi ile iletişim hala çok şimdi benim kod gibidir, sahibine ortalamak olmadığını fark ettik.

Yardımlarınız için teşekkürler!

+0

Sadece yapmazdım:

Window ancestor = SwingUtilities.getWindowAncestor(this); 

veya

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

cevap

13

Değil

emin tam olarak ne burada bir sorun olarak var, ama birden modal diyaloglar olabilir nasıl bir örnektir Ayarlar penceresi herhangi bir şey için modal olur. Uygulamayı ayarlar penceresinde çalışırken kullanmaları gerekiyorsa ne olur? Bana çok kısıtlayıcı görünüyor.
+0

Güzel, ama neden yeni 'JDialog'lar merdiven şeklinde açılır? – zygimantus

+1

@zygimantus Bu, doğrudan "dialog.setLocationRelativeTo (button)" çağrısından kaynaklanır –

5

1.Please

bir JDialog ait (J) Frame almak için bir yol 2.Is The New Modality API in Java SE 6 oku?

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(); 
      } 
     }); 
    } 
}