如果你不知道“AdjustWidowRect”是做什么的,下面是 MSDN 的描述:
根据所需的客户端矩形大小计算所需的窗口矩形大小。
更清楚:
在 Swing 中,当您设置 JFrame 的大小时,包括边框。这意味着如果您将 JFrame 的大小设置为 640 x 480,那将不是客户端大小,因为您输入的大小会计算框架边框的大小。
我想要一个矩形,并且能够对其进行调整,因此当 JFrame 的大小设置为该矩形时,JFrame 的客户端大小就是调整前的矩形。
如果你不知道“AdjustWidowRect”是做什么的,下面是 MSDN 的描述:
根据所需的客户端矩形大小计算所需的窗口矩形大小。
更清楚:
在 Swing 中,当您设置 JFrame 的大小时,包括边框。这意味着如果您将 JFrame 的大小设置为 640 x 480,那将不是客户端大小,因为您输入的大小会计算框架边框的大小。
我想要一个矩形,并且能够对其进行调整,因此当 JFrame 的大小设置为该矩形时,JFrame 的客户端大小就是调整前的矩形。
您必须计算 JFrame 的插图并将它们添加到所需的客户端大小,以设置 JFrame 的大小。
Insets insets = getInsets();
AFAIU 接受的答案不考虑菜单栏或混合中的其他组件。这是通过覆盖组件的首选大小并打包框架来实现的。
我正在向 JFrame 绘制图形,我需要它的尺寸精确。
不要在顶级容器上绘画,例如JFrame
或JWindow
。而是渲染到JPanel
orBufferedImage
并将其添加到 TLC。
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);
}
}