【问题标题】:Resizing JPanel on OS X在 OS X 上调整 JPanel 的大小
【发布时间】:2014-04-22 02:19:39
【问题描述】:

我有两个 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();

是否存在解决此问题的方法?

【问题讨论】:

  • 不相关:dialog.show(),应该是dialog.setVisible(true)

标签: java swing jdialog


【解决方案1】:

当对话框调整大小或最大化时,以下完整示例不会冻结。这里有几点需要注意:

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

  • Invoking pack() “导致此 Window 调整大小以适合其子组件的首选大小和布局。”由于对话框只包含一个空的Jpanel,我已经覆盖了getPreferredSize() 以显示效果。

  • Swing GUI 对象应event dispatch thread 上构造和操作。

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();
            }
        });
    }
}

【讨论】:

  • 解决方案不起作用。这似乎是 OSX 特定的 Java HotSpot 错误。
  • @Andrew:它适用于我在 Java 8 下;还要考虑看到herehere 的增强。
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2015-02-20
  • 2012-09-01
相关资源
最近更新 更多