JFrame是可缩放(错误)大小调整问题

我打算制作一个ContentPanel为600×600的JFrame,我希望JFrame不会重新resize。 在这个盒子里面,我绘制了一个600×600的红色轮廓矩形,以确保在运行程序时所有内容都匹配。 在限制JFrame的大小调整之前,我通过执行以下操作来设置JFrame的大小:

getContentPane().setPreferredSize( new Dimension(600,600)); pack(); 

当我启动程序时,我的矩形边界与JFrame的尺寸完全吻合。 但是,当我将isResizable(false)添加到等式中时,我的矩形的右边缘和矩形的底边之间似乎存在像素缓冲区。 通过一些试验和错误,似乎isResizable(false)为高度和宽度增加了10个像素。 (因此,对于contentPane +额外10的维度为590×590是我的解决方法)

我的问题为什么会这样? 我似乎无法在任何地方找到关于额外10个像素的任何文档?

注意:通过在不修改大小的情况下制作JFrame也可以观察到此exception。 在不使其不可resize的情况下,没有可观察的panel / contentPane,但是当使用isResizable(false)时,面板/窗格中有可见部分。

你是对的,设置一个不可靠的框架似乎增加了10个像素的高度和宽度,至于为什么,我不能说,这似乎是更新本地对等的副作用,但是……

您可以在调用JFrame#setResizable之后通过调用JFrame#pack重置它

 public class TestResizableFrame { public static void main(String[] args) { new TestResizableFrame(); } public TestResizableFrame() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new FixedPane()); frame.setResizable(false); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class FixedPane extends JPanel { @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Dimension size = getSize(); String text = size.width + "x" + size.height; FontMetrics fm = g.getFontMetrics(); int x = (getWidth()- fm.stringWidth(text)) / 2; int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent(); g.drawString(text, x, y); g.setColor(Color.RED); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); } } } 
Interesting Posts