是否有一个Java JFrame等效的Win32函数“AdjustWindowRect”?

时间:2012-12-12 16:29:22

标签: java swing user-interface

如果您不知道“AdjustWidowRect”的作用,请参阅MSDN中的说明:

  

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

更清楚:

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

我想要一个矩形,并且能够调整它,这样当JFrame的大小设置为该矩形时,JFrame的客户端大小就是调整前矩形的大小。

2 个答案:

答案 0 :(得分:3)

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

Insets insets = getInsets();

答案 1 :(得分:2)

AFAIU接受的答案不考虑混合中的菜单栏或其他组件。这可以通过覆盖组件的首选尺寸和包装框架来实现。

  

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

请勿绘制到顶级容器,例如JFrameJWindow。而是呈现为JPanelBufferedImage并将其添加到TLC。

Sized GUI - from the 'inside out'

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