Java JFrame .setSize(x,y)不起作用?

当我执行这段代码时,弹出一个小窗口,其内部大约是116×63,整个大小包括~140×100的边框。 如何将内部设置为我需要的内容?

public static void graphics() { JFrame frame = new JFrame(); String title = "test window"; frame.setTitle(title); frame.setSize(gridRow, gridCol); //101 x 101 frame.setResizable(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } 

  1. 创建一个从JPanel扩展的自定义组件,覆盖其getPreferredSize方法以返回您想要的窗口大小。
  2. 将其添加到框架或将其设置为框架的内容窗格。
  3. 呼叫pack在框架上

更新了示例

在此处输入图像描述

在我的电脑上, Frame size = java.awt.Dimension[width=216,height=238]

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TestFrameSize01 { public static void main(String[] args) { new TestFrameSize01(); } public TestFrameSize01() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); System.out.println("Frame size = " + frame.getSize()); } }); } public class TestPane extends JPanel { public TestPane() { } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); String text = getWidth() + "x" + getHeight(); FontMetrics fm = g2d.getFontMetrics(); int x = (getWidth() - fm.stringWidth(text)) / 2; int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent(); g2d.drawString(text, x, y); g2d.dispose(); } } }