2012-02-25 99 views
2

你好我的工作我的项目我的基于Swing GUI的一部分,我需要定义的setBounds Jframe的方法用的setResizable呼叫同步,所以我这样做:摇摆的setResizable和的setBounds

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。 谢谢。

回答

6

设置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()); 
    } 
} 
+0

它不适合我。我只是试了一下。其实我有一个基于框架和许多面板的向导,我改变框架上的面板就像状态一样。只有在一个小组中,我想给用户调整框架的机会,否则它不应该调整大小。 – AlexTheo 2012-02-25 13:03:21

+0

@AlexTheo:那么你需要更新你的问题,并提供所有相关的信息,包括这个和更多的细节。考虑创建和发布[sscce](http://sscce.org),就像我的帖子一样,它会让我们看到你自己的问题,并允许我们修改和测试工作代码。 – 2012-02-25 13:05:33

+0

好的,就这样做了。 – AlexTheo 2012-02-25 13:12:44

3

如所建议的通过@Hovercraft和here示出并讨论here,你应该pack()你的包围Window,依靠各组分的优选大小。可能发生的情况是,您的项目包含一个不包含其他组件并且没有固有的首选大小的显示面板。在这种情况下,请覆盖getPreferredSize()并返回一个Dimension,以反映您问题中指示的屏幕分数。