如果您不知道“AdjustWidowRect”的作用,请参阅MSDN中的说明:
根据所需的客户端矩形大小计算窗口矩形所需的大小。
更清楚:
在swing中,设置JFrame的大小时,包括边框。这意味着如果您将JFrame的大小设置为640乘480,那将不是客户端大小,因为您输入的大小会计算帧边框的大小。
我想要一个矩形,并且能够调整它,这样当JFrame的大小设置为该矩形时,JFrame的客户端大小就是调整前矩形的大小。
答案 0 :(得分:3)
您必须计算JFrame的insets并将它们添加到所需的客户端大小,以设置JFrame的大小。
Insets insets = getInsets();
答案 1 :(得分:2)
AFAIU接受的答案不考虑混合中的菜单栏或其他组件。这可以通过覆盖组件的首选尺寸和包装框架来实现。
我正在向JFrame绘制图形,我需要它是一个精确的尺寸。
请勿绘制到顶级容器,例如JFrame
或JWindow
。而是呈现为JPanel
或BufferedImage
并将其添加到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);
}
}