您好,我正在我的项目的基于swing的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);


但是结果是我的框架没有达到给定的范围,只是禁用了调整大小功能。如果我删除了最后一个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以便将可调整大小的标志设置为false,但这也无济于事。
有人知道这个问题的解决方案吗?我正在运行Linux和oracle jdk7。
谢谢。

最佳答案

与调用pack()一起设置preferredSize一直很适合我。

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());
   }
}

07-27 23:09