3

如果你不知道“AdjustWidowRect”是做什么的,下面是 MSDN 的描述:

根据所需的客户端矩形大小计算所需的窗口矩形大小。

更清楚:

在 Swing 中,当您设置 JFrame 的大小时,包括边框。这意味着如果您将 JFrame 的大小设置为 640 x 480,那将不是客户端大小,因为您输入的大小会计算框架边框的大小。

我想要一个矩形,并且能够对其进行调整,因此当 JFrame 的大小设置为该矩形时,JFrame 的客户端大小就是调整前的矩形。

4

2 回答 2

3

您必须计算 JFrame 的插图并将它们添加到所需的客户端大小,以设置 JFrame 的大小。

Insets insets = getInsets();
于 2012-12-12T16:34:15.843 回答
2

AFAIU 接受的答案不考虑菜单栏或混合中的其他组件。这是通过覆盖组件的首选大小并打包框架来实现的。

我正在向 JFrame 绘制图形,我需要它的尺寸精确。

不要在顶级容器上绘画,例如JFrameJWindow。而是渲染到JPanelorBufferedImage并将其添加到 TLC。

大小 GUI - 从“内而外”

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class SizedGUI {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                // the GUI as seen by the user (without frame)
                JPanel gui = new JPanel(new BorderLayout());
                gui.setBorder(new EmptyBorder(2,3,2,3));

                gui.add(new FixedSizeComponent());

                gui.setBackground(Color.RED);

                JFrame f = new JFrame("Demo");
                f.add(gui);
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See http://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // tweak to ensure the GUI never gets too small
                f.setMinimumSize(f.getSize());
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}

class FixedSizeComponent extends JPanel {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400,100);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int w = getWidth();
        int h = getHeight();
        g.setColor(Color.BLACK);
        g.drawString(w + "x" + h, w/2, h/2);
    }
}
于 2012-12-13T02:01:16.400 回答