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);
}
}
* "대화 상자가 모달이지만 부모 프레임을 계속 클릭 할 수 있습니다"* 프레임이 대화 상자의 부모입니까? –
예 Andrew, 프레임은 대화 상자의 부모입니다. – Lyndon