Java 在OSX上调整JPanel的大小

Java 在OSX上调整JPanel的大小,java,swing,jdialog,Java,Swing,Jdialog,我有两个Swing组件: JDialog->JPanel 我想用JPanel填充JDialog中的所有空间。默认设置可以正常工作。 我可以更改对话框的大小,并且JPanel的大小已正确更改 但当我点击“最大化”图标时,内部JPanel被冻结,直到窗口被最大化 OSX版本10 Java版本1.7 代码示例: final JDialog dialog = new JDialog(mainFrame, true); dialog.setSize(new Dimension(800, 600)); di

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

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

但当我点击“最大化”图标时,内部JPanel被冻结,直到窗口被最大化

OSX版本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();

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

以下完整示例在调整对话框大小或最大化对话框时不会冻结。以下是需要注意的几点:

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

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

  • Swing GUI对象应仅在上构造和操作


无关:
dialog.show()
,应该是
dialog.setVisible(true)
解决方案不起作用。这似乎是OSX特定的Java热点错误。@Andrew:它在Java 8下对我有效;还考虑了所看到的增强。
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();
            }
        });
    }
}