2010-01-30 74 views
0

自动改变大小,我发现我的容器实际上是改变它的大小,不一会正在建造问题 - 集装箱用Java

后当它的构造,设置我的部件是在我想要的地方(如30PX从右侧边缘的距离),但很短的一段时间后后,我发现它从1008x730至1018x740变成...

(我的JFrame的是1024×768)

有谁知道为什么会这样,以及如何我可以停止这个自动调整大小的东西?

谢谢。

我只是做了 -

while (true) { 
     System.out.println(c.getSize()); 
} 

而且经过几次反复改变大小。

〜编辑

+0

总是一个好主意,将问题隔离为一个小例子,然后发布代码供我们查看。 – 2010-01-30 15:09:45

+0

对不起,我只是测试了一下,发现了这个,编辑过,谢谢。 – Dois 2010-01-30 15:17:28

回答

2

这听起来像你正在做的事情,改变组件的大小和重新验证pack()JFrame。此外,不是调用setSize(),而是设置组件的首选大小并让LayoutManager排列组件。

附录:在top-level container上调用pack()通常更好,以便获得正确的初始大小。此外,JFrame的内容窗格默认为BorderLayout,这可能不是您想要的。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class MyPanel extends JPanel { 

    public MyPanel() { 
     this.setLayout(new GridLayout(2, 2)); 
     this.setPreferredSize(new Dimension(320, 240)); 
     for (int i = 0; i < 4; i++) { 
      JLabel label = new JLabel(String.valueOf(i)); 
      label.setHorizontalAlignment(JLabel.CENTER); 
      label.setBorder(BorderFactory.createLineBorder(Color.blue)); 
      this.add(label); 
     } 

    } 

    private static void create() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new MyPanel()); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 
} 
+0

我已经尝试过使用setPreferredSize(但在setSize之前,它会影响任何东西吗?),但它不起作用。 此外,我不打电话pack()...我正在从getContentPane()实际上围绕容器工作。 顺便说一句,在我大约一周前开始之后,我发现人们更喜欢使用JPanel,比如你如何做,所以下次我会尝试一下,但是,它是一个容量增加了一些的容器原因,但JFrame保持正确的大小 - setPreffered/Max/Min大小不起作用... – Dois 2010-01-31 04:18:46

+0

由于这些原因,我很少使用'setSize()'。我在上面添加了一些链接。 – trashgod 2010-01-31 17:40:21

1

如果你可以从你的IDE运行此或与调试这将是很容易只设置一个断点上设置大小的方法进行远程连接。

或者交替,你可以用你自己的类继承的JFrame,同样覆盖这些方法,并做

try { throw new Exception("here!"); } catch(Exception e) { e.printStackTrace(); } 

这会告诉你是什么原因造成的尺寸变化。

+0

@Alex Miller - 获取堆栈跟踪的更简单方法是使用'Thread.dumpStack();' – McDowell 2010-01-30 15:58:18

+0

事情是,只有一个区域可以设置大小。看起来好像只是在等一会儿之后才发生。我在进入循环之前已经打印了它,并且在循环中进行了几次迭代之后(实际上进行了大量迭代,因为循环速度太快)以致尺寸发生变化。 我试过插入一个JOptionPane.showInputDialog,现在它在放入我的输入后总是改变大小。 – Dois 2010-01-30 16:18:17

1

听起来像布局管理器踢英寸尝试与Swing资源管理器运行,看看它对世界的看法。

+0

+1对于Swing Explorer:https://swingexplorer.dev.java.net/ – trashgod 2010-01-30 17:22:42