2013-07-25 185 views
1

嗨我正在寫一個簡單的程序來顯示一個框架。 然而,當我輸入setLayout(null); 但是,如果我忽略此命令,該按鈕始終在頂部中心 有人能指出我的錯誤嗎?JFrame非常小,使用空佈局

import java.io.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 

class theframe { 

    private static void create() { 
     JFrame frame = new JFrame("FrameDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Insets insets = frame.getInsets(); 
     frame.setSize(500 + insets.left + insets.right, 350 + insets.top + insets.bottom); 
     add(frame.getContentPane()); //my function add 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void add(Container pane) { 
     pane.setLayout(null); 
     Insets insets = pane.getInsets(); 

     JPanel p1 = new JPanel(); 
     p1.setPreferredSize(new Dimension(500, 350)); 

     JButton b1 = new JButton("one"); 
     Dimension size = b1.getPreferredSize(); 
     b1.setBounds(25 + insets.left, 5 + insets.top, size.width, size.height); 

     pane.add(p1); 
     p1.add(b1); 
    } 

    public static void main(String Args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       create(); 
      } 
     }); 
    } 
} 
+6

規則似乎是「沒有沒有LayoutManager的用戶界面」。 –

+2

嘗試在打包後設置「JFrame」的大小。否則'pack()'會重置你的大小。 –

+0

對不起,我不明白。 我正在從oracle教程學習和使用空佈局 我不知道爲什麼它發生我的運行 –

回答

5

你調用pack()法與絕對定位(佈局),你應該使用佈局管理,而不是使用佈局設置爲null

只是刪除這一行:

pane.setLayout(null); 

注:採納我的建議,並瞭解自己LayoutManagers,因爲如果你拒絕學習,你可能會去null佈局,是的,它是更容易,但強烈建議不要使用它。

一些基本的東西,你必須知道:

  1. JFrame的默認佈局爲BorderLayout,其中有隻有五個位置,你可以把你的組件中的鏈接,如圖所示。
  2. FlowLayout是每個JPanel的默認佈局管理器。它只是在單行中放置組件,如果其容器不夠寬,則開始新行。

畢竟,閱讀更多關於LayoutManagers使用擺動起動之前,相信的我來說,它使您的工作更輕鬆非常,只是嘗試,這是驚人的。

+0

是的,但按鈕總是居中頂部,我不能在面板上設置其位置 –

+0

@Azdad使用'pane.setPreferredSize(someDimension);'將解決問題,你不需要使用佈局管理器。創建GUI應用程序時最好使用它,但這裏的空佈局不是問題。 – BackSlash

+3

*「我無法在面板上設置其位置」*您**不應該設置組件的位置。 –

5

如果你看到包()函數,它是不是在JFrame.java但Window.java

public void pack() { 
    Container parent = this.parent; 
    if (parent != null && parent.getPeer() == null) { 
     parent.addNotify(); 
    } 
    if (peer == null) { 
     addNotify(); 
    } 
    Dimension newSize = getPreferredSize(); 
    if (peer != null) { 
     setClientSize(newSize.width, newSize.height); 
    } 

    if(beforeFirstShow) { 
     isPacked = true; 
    } 

    validateUnconditionally(); 
} 

現在如果你看到的getPreferredSize()在Container.java

@Deprecated 
public Dimension preferredSize() { 
    /* Avoid grabbing the lock if a reasonable cached size value 
    * is available. 
    */ 
    Dimension dim = prefSize; 
    if (dim == null || !(isPreferredSizeSet() || isValid())) { 
     synchronized (getTreeLock()) { 
      prefSize = (layoutMgr != null) ? 
       layoutMgr.preferredLayoutSize(this) : 
       super.preferredSize(); 
      dim = prefSize; 
     } 
    } 
    if (dim != null){ 
     return new Dimension(dim); 
    } 
    else{ 
     return dim; 
    } 
} 
功能

一切都歸結爲layoutMgr.preferredLayoutSize(this); 由於您沒有設置佈局(或空),你會得到這個問題。刪除該語句或使用一些佈局。

+0

我只是說一切都歸結爲設置佈局。如果OP想要瀏覽代碼,則突出顯示僅用於信息。我在這裏沒有看到任何廢話。 –

+0

夠公平的,我讀得太少,你的回答太快,並且錯誤地認爲你是在暗示'pack()'不是一個可以用於框架的方法。我的錯。 :P ..和遲到+1 :) –

+0

發生......不用擔心:) –

2

Java GUI可能必須在多個平臺上工作,使用不同的PLAF在不同的屏幕分辨率&上。因此,它們不利於組件的準確放置。

要爲可靠的GUI組織組件,請使用佈局管理器或它們的組合,以及用於空白區域的佈局填充&邊框。

的提示請參見this answer如何:

  1. 結合的佈局。
  2. 使用佈局構造函數參數&邊框提供空白區域。

1

我有同樣的問題luckly,我解決了一行代碼。願這也將幫助您在按照下列步驟操作:在您的文件中的代碼

1頁轉到

2。在代碼開始找到這一行:

  initComponents(); 

3-只需添加這個新此行之後的代碼:

this.setMinimumSize(new Dimension(300, 300)); 

關鍵字「這個」在這裏表示當前的頂層組件,所以新的尺寸(300,300)在這裏應用。您可以根據您所需的幀/組件大小更改這300個值。