2011-12-29 24 views
1

Mac OSXアプリケーションでよく見られるように、ProgressBarをフレームのタイトルバーの中央に表示する必要がある小さなアプリケーションを作成しています。私は2つの問題があります:Java SwingモーダルダイアログをMac OSXダイアログのように動作させる

です。私は位置を管理しましたが、親フレームのタイトルバーの高さをハードコードする必要がありました。 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 

:ダイアログのコンストラクタで

。 Dialogはモーダルですが、親フレームをクリックして移動することはできます。親フレームにダイアログのスティックを作成するにはどうしたらいいですか?つまり、親フレームが移動されると、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という2つのクラスがあります。実行するには、[ダイアログを開く]ボタンをクリックしてダイアログを読み込みます。 JFrameのTitleBarをクリックして移動します。 – Lyndon

+0

私はこれをOSX 10.6のiMacで実行していることに注意してください。違いがあるかどうかはわかりません。 – Lyndon

関連する問題