2012-06-25 32 views
10

Tôi có một hộp thoại cài đặt phương thức là một JDialog. Trong cửa sổ cài đặt này, tôi đặt một số thành phần bao gồm một nút đến một hộp thoại cài đặt phương thức khác cũng là một JDialog. Tôi đã biến chúng thành JDialogs bởi vì đó là cách duy nhất tôi biết để tạo ra một hộp thoại phương thức.Làm thế nào để tạo ra một JDialog phương thức trên đầu trang của một JDialog phương thức

Vấn đề là: khi tôi tạo hộp thoại cài đặt chính, tôi phải xây dựng JDialog hoặc không có Khung cha hoặc với Khung cha. Kể từ khi cửa sổ chính của tôi là một JFrame, tôi chỉ có thể vượt qua đó để xây dựng hộp thoại cài đặt chính. Nhưng khi tôi muốn tạo hộp thoại cài đặt phương thức thứ hai cần có hộp thoại cài đặt chính làm cha mẹ, tôi không thể tìm cách lấy Khung (J) của JDialog. Tôi muốn vượt qua hộp thoại cài đặt chính đó làm cha mẹ để hộp thoại cài đặt thứ hai tập trung vào hộp thoại khi nó được hiển thị. Giả sử hộp thoại cài đặt thứ hai không có hàm tạo để truyền một vị trí, chỉ là các hàm tạo của JDialog.

Có cách nào để lấy Khung (J) của JDialog không? Có lỗ hổng thiết kế nào trong thiết lập của tôi và tôi có nên sử dụng một thứ gì đó khác cho các hộp thoại cài đặt này không? (Và nếu như vậy, làm thế nào nên tôi làm cho các thiết lập hộp thoại thay thế phương thức?)

Cảm ơn bạn đã giúp đỡ của bạn, Erik

UPDATE: Cảm ơn tất cả các bạn cho câu trả lời của bạn. Họ đã dẫn tôi hiểu rằng dường như không cần thiết phải có một chủ sở hữu cho một JDialog. Tôi nghĩ rằng điều này là cần thiết cho hộp thoại để có thể vô hiệu hóa các chủ sở hữu cho đến khi hộp thoại được đóng lại, nhưng dường như các phương thức độc lập của chủ sở hữu. Tôi cũng nhận thấy rằng ngay cả với chủ sở hữu hộp thoại vẫn không tập trung vào chủ sở hữu, vì vậy giờ mã của tôi giống như:

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

Điều này cũng cho phép các hộp thoại phương thức trong hộp thoại phương thức.

Cảm ơn sự giúp đỡ của bạn!

+0

tôi sẽ chỉ không làm cho cửa sổ cài đặt là phương thức cho mọi thứ. Điều gì xảy ra nếu họ cần sử dụng ứng dụng trong khi họ đang làm việc trong cửa sổ cài đặt? Nó có vẻ rất hạn chế đối với tôi. –

Trả lời

13

Không chắc gì chính xác bạn có là một vấn đề, nhưng đây là một ví dụ về cách bạn có thể có nhiều hộp thoại modal:

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

Đẹp, nhưng tại sao mới 'JDialog' được mở theo cách cầu thang? – zygimantus

+1

@zygimantus Đó là trực tiếp gây ra bởi các cuộc gọi đến 'dialog.setLocationRelativeTo (nút) ' –

5

1.please đọc The New Modality API in Java SE 6

2.Is Có cách nào để có được (J) Khung của một JDialog?

Window ancestor = SwingUtilities.getWindowAncestor(this); 

hoặc

Window ancestor = (Window) this.getTopLevelAncestor(); 
Các vấn đề liên quan