Swing setResizable和setBounds

您好我正在基于我的项目的基于摇摆的gui部分工作,我需要将setBounds JFrame的方法与setResizable调用同步,所以我这样做:

setResizable(true); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle rect = new Rectangle(screenSize.width/2 - screenSize.width/4, screenSize.height/2 - screenSize.height/4, screenSize.width/2, screenSize.height/2); setBounds(rect); setResizable(false); 

但结果是我的框架没有得到给定的边界它只是禁用resizefunction。 如果我删除最后一个setResizable调用,那么表单将获得正确的边界。 实际上我有一个基于框架和许多面板的向导,我更改框架上的面板状态。 只有在一个面板中,我想给用户提供调整框架大小的机会,否则它应该是固定大小的。 所以在我的主框架中我实现了两个方法,enableWizardMode和enablePlayingGameMode:

  @Override public void enablePlayingGameMode() { setResizable(true); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(new Rectangle(screenSize.width/10, screenSize.height/10, screenSize.width - screenSize.width/5, screenSize.height- screenSize.height/5)); } @Override public void enableWizardMode() { setResizable(true); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(new Rectangle(screenSize.width/2 - screenSize.width/4, screenSize.height/2 - screenSize.height/4, screenSize.width/2, screenSize.height/2)); setResizable(false); } 

我尝试使用IComponentListener,但它没有帮助我随机调整框架大小。 我也尝试使用SwingUtilities.invokeLater将resizable标志设置为false,但它也没有帮助。 有人知道这个问题的解决方案吗? 我运行Linux和oracle jdk7。 谢谢。

设置preferredSize以及调用pack()一直很适合我。

 import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Toolkit; import javax.swing.JFrame; public class SizeFoo { public static void main(String[] args) { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle rect = new Rectangle(screenSize.width / 2 - screenSize.width / 4, screenSize.height / 2 - screenSize.height / 4, screenSize.width / 2, screenSize.height / 2); System.out.println("rect: " + rect); JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setPreferredSize(new Dimension(rect.width, rect.height)); frame.setResizable(false); frame.pack(); frame.setLocation(rect.x, rect.y); //frame.setLocationRelativeTo(null); frame.setVisible(true); System.out.println("JFrame size:" + frame.getSize()); } } 

正如@Hovercraft所建议并在此处所示并在此处讨论的那样,您应该根据组件的首选大小pack()封闭的Window 。 可能会发生您的项目包含主导显示面板,该面板不包含其他组件且没有固有的首选大小。 在这种情况下,覆盖getPreferredSize()并返回一个Dimension ,它反映了问题中指示的屏幕分数。