访问和更改放置在JDialog上的组件的大小

时间:2016-08-06 14:23:57

标签: java swing user-interface layout-manager jdialog

我创建了一个模态 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);
    }
}

enter image description here

2 个答案:

答案 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)

您可以使用default经理轻松创建预期的布局:

MigLayout

截图:

Screenshot of the code example