2012-06-25 3 views
10

모달 대화 상자가 JDialog입니다. 이 설정 창에서 단추를 포함한 일부 구성 요소를 JDialog 인 또 다른 모달 설정 대화 상자에 배치했습니다. 모달 대화 상자를 만드는 유일한 방법이기 때문에 JDialog를 만들었습니다.다른 모달 JDialog 위에 모달 JDialog를 만드는 방법

문제는 이것입니다. 기본 설정 대화 상자를 만들 때 상위 프레임이나 상위 프레임없이 JDialog를 구성해야합니다. 내 메인 윈도우가 JFrame이기 때문에 기본 설정 대화 상자 생성자로 전달할 수 있습니다. 하지만 부모로서 기본 설정 대화 상자를 가져야하는 두 번째 모달 설정 대화 상자를 만들려면 JDialog의 (J) 프레임을 가져 오는 방법을 찾을 수 없습니다. 기본 설정 대화 상자를 부모로 전달하여 두 번째 설정 대화 상자가 표시 될 때이 설정 대화 상자를 중앙에 배치하려고합니다. 두 번째 설정 대화 상자에 위치 전달을위한 생성자가없고 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

난 그냥하지 것이다 :

Window ancestor = SwingUtilities.getWindowAncestor(this); 

또는

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

답변

13

하지

있는지 정확히 당신이 여기에서 문제로,하지만 당신은 여러 모달 대화 상자를 가질 수있는 방법에 대한 예입니다 설정 창은 모달이어야합니다. 설정 창에서 작업하는 동안 응용 프로그램을 사용해야하는 경우에는 어떻게해야합니까? 나에게 매우 제한적인 것처럼 보입니다.
+0

좋은데, 왜 새로운'JDialog'가 계단 방식으로 열리나요? – zygimantus

+1

@zygimantus 이것은'dialog.setLocationRelativeTo (button)'호출에 의해 직접적으로 발생합니다. –

5

1. 반드시이

JDialog에의 (J) 프레임을 얻을 수있는 방법이 2.Is The New Modality API in Java SE 6 읽어?

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(); 
      } 
     }); 
    } 
} 
관련 문제