2010-01-30 76 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