2011-12-29 3 views
1

Mac OSX 앱에서 자주 볼 수있는 것처럼 ProgressBar를 프레임의 TitleBar 아래에 가운데로 표시해야하는 작은 응용 프로그램을 작성하고 있습니다. 두 가지 문제가 있습니다 :자바 스윙 모달 대화 상자가 Mac OSX 대화 상자처럼 작동하도록 만들기

. 나는 포지셔닝을 관리했지만 부모 프레임의 TitleBar 높이를 하드 코딩해야했습니다. TitleBar의 높이를 가져 오는 '부드러운'방법이 있습니까? 대화 상자의 생성자에서

:

Dimension dimensionParentFrame = parent.getSize(); 
Dimension dimensionDialog = getSize(); 
int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width)/2); 
setLocation(x, parent.getY() + 22);    // TODO HARD CODE WARNING TITLE HEIGHT 

2. 대화 상자가 모달인데도 부모 프레임을 클릭하고 이동할 수 있습니다. 부모 프레임에 대화 상자 '막대기'를 만들려면 어떻게해야합니까? 즉, 부모 프레임이 이동되면 Dialog는 마치 첨부 된 것처럼 움직입니다.

모든 도움말/포인터가 많이 감사하겠습니다.

대화 상자가 모달 비록


    import javax.swing.JFrame; 
    import javax.swing.JButton; 
    import java.awt.BorderLayout; 
    import java.awt.EventQueue; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent; 


    public class ModalDialogDemoFrame extends JFrame 
    { 
     ModalDialogDemoFrame modalDialogDemo; 
     public ModalDialogDemoFrame() 
     { 
     modalDialogDemo = this; 
     setBounds(100, 100, 400, 400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton buttonDialog = new JButton("Open Dialog"); 
     buttonDialog.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent arg0) 
      { 
      // Create a Modal Dialog with this Frame as Parent. 
      ModalDialog modalDialog = new ModalDialog(modalDialogDemo, true); 
      modalDialog.setVisible(true); 
      } 
     }); 
     getContentPane().add(buttonDialog, BorderLayout.CENTER); 
     } 

     /** 
     * @param args 
     */ 
     public static void main(String[] args) 
     { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
      try 
      { 
       ModalDialogDemoFrame window = new ModalDialogDemoFrame(); 
       window.setVisible(true); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      } 
     }); 
     } 

    } 

    import java.awt.Dimension; 

    import javax.swing.JDialog; 
    import javax.swing.JFrame; 
    import javax.swing.JButton; 
    import java.awt.BorderLayout; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent; 


    public class ModalDialog extends JDialog 
    { 
     public ModalDialog(JFrame parent, boolean modal) 
     { 
     super(parent, modal); 
     Dimension dimensionParentFrame = parent.getSize(); 
     setSize(new Dimension((parent == null) ? 300 : dimensionParentFrame.width/2, 75)); 
     Dimension dimensionDialog = getSize(); 
     int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width)/2); 
     setLocation(x, parent.getY() + parent.getInsets().top); 
     setUndecorated(true); 
     setModal(modal); 
     setModalityType(ModalityType.APPLICATION_MODAL); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

     JButton buttonClose = new JButton("Close"); 
     buttonClose.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
      dispose(); 
      } 
     }); 
     getContentPane().add(buttonClose, BorderLayout.CENTER); 
     } 

    } 

+0

* "대화 상자가 모달이지만 부모 프레임을 계속 클릭 할 수 있습니다"* 프레임이 대화 상자의 부모입니까? –

+0

예 Andrew, 프레임은 대화 상자의 부모입니다. – Lyndon

답변

3
int titleBarHeight = frame.getInsets().top; 

, 난 아직도 부모의 프레임을 클릭하고 이동할 수 있습니다 : 여기

는 코드입니다.

그런데 이런 일이 일어나지 않아야합니다.

SSCCE 문제를 나타내는 게시하십시오.

+0

frame.getInsets(). top; TitleBar 높이를 가져옵니다. 감사. – Lyndon

+0

SSCCE에는 부모 JFrame과 JDialog의 두 클래스가 있습니다. 실행, '대화 상자 열기'버튼을 클릭하여 대화 상자를 불러옵니다. 그런 다음 JFrame의 TitleBar를 클릭하고 이동하십시오. – Lyndon

+0

OSX 10.6의 iMac에서 실행 중이므로, 이것이 차이를 일으키는 지 모르겠습니다. – Lyndon

관련 문제