我创建了一个模态 JDialog(为了正确,是JDialog的子代),并在用户点击JFrame上的JButton时将其设置为可见。为确保JDialog上的内容垂直居中,我已覆盖 setVisible()方法并在调用super.setVisible(true)
之前执行一些操作。这里的问题是,如果对话框设置为模态,则在调用 setVisible(true)之前,没有放在对话框上的组件的大小超过0。此外, setVisible()会阻止执行。
有关如何绕过/解决此问题的任何建议/提示?
示例代码:
public class SampleDialog extends JDialog {
protected JPanel contentPane;
public SampleDialog() {
super();
setLayout(new BorderLayout());
setDefaultCloseOperation(HIDE_ON_CLOSE);
setModal(true);
JPanel headerPane = new JPanel();
headerPane.setBackground(Color.GREEN);
add(headerPane, BorderLayout.NORTH);
contentPane = new JPanel();
contentPane.setBackground(Color.WHITE);
add(contentPane, BorderLayout.CENTER);
JPanel footerPane = new JPanel();
footerPane.setBackground(Color.YELLOW);
add(footerPane, BorderLayout.SOUTH);
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
contentPane.add(new JLabel("Code"));
contentPane.add(new JTextField());
contentPane.add(new JLabel("Password"));
contentPane.add(new JPasswordField());
contentPane.add(new JButton("Login"));
}
@Override
public void setVisible(boolean b) {
/*
* Get total height of all components added to 'contentPane'
* Place Box.createVerticalStrut() before and after the 'contentPane' components,
* so the input fields look like they are centered vertically
* !!! Cannot determine size of any component because it is not rendered
*/
super.setVisible(b);
}
}
答案 0 :(得分:2)
确保JDialog上的内容是垂直居中的,我已经覆盖了setVisible()
你不应该为此重写setVisible()。
要使组件居中,请使用适当的布局管理器。
例如,要垂直和水平居中组件,您只需使用GridBagLayout:
JDialog dialog = new JDialog();
dialog.setLayout( new GrigBagLayout() );
JPanel panel = new JPanel(...);
panel.add(...);
dialog.add(panel, new GridBagConstraints());
答案 1 :(得分:0)