在OS X上调整JPanel的大小

时间:2014-03-17 00:06:17

标签: java swing jdialog

我有两个Swing组件: JDialog - >的JPanel

我想用JPanel填充JDialog中的所有空格。默认设置正常。 我可以更改对话框的大小,并正确更改JPanel的大小。

但是当我点击"最大化"图标然后内部JPanel冻结,直到窗口将最大化。

OS X版本10;
Java版本1.7。

代码示例:

final JDialog dialog = new JDialog(mainFrame, true);
dialog.setSize(new Dimension(800, 600));
dialog.setLocationRelativeTo(null);
final JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 14));
dialog.add(panel);
dialog.show();

是否存在修复此行为的方法?

1 个答案:

答案 0 :(得分:1)

调整对话框大小或最大化时,以下完整示例不会冻结。以下是一些需要注意的事项:

  • JPanel的默认布局为FlowLayout;为了比较,我将框架的布局设置为相同。

  • 调用pack()“使Window的大小适合其子组件的首选大小和布局。”由于该对话框仅包含空Jpanel,因此我已覆盖getPreferredSize()以显示效果。

  • 应在event dispatch thread构建和操作Swing GUI对象。

image

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * @see https://stackoverflow.com/a/22450263/230513
 */
public class Test {

    private void display() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        frame.add(new JLabel("Frame"));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        JDialog dialog = new JDialog(frame, true);
        final JPanel panel = new JPanel(){

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320, 240);
            }
        };
        panel.add(new JLabel("Dialog"));
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 14));
        dialog.add(panel);
        dialog.pack();
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}