2012-04-04 85 views
6

如何將組件放置在特定位置的佈局中。 就像我想放置2個文本框在第一行,下面3個組合框。如何將組件放置在特定位置?

但是,當我試圖把他們都出現在一行,我用了flowlayout。我也使用了邊框。當我調整大小時,組件的窗口大小將從邊框出去。

你可以建議我使用一些佈局以及如何使用它?

這裏是我的代碼:

topPanel=new JPanel(); 
topPanel.setLayout(new FlowLayout()); 
topPanel.setBorder(new TitledBorder(new EtchedBorder(), "Customer Data")); 

CNameTextField = new JTextField (20); // create the Customer Name text field 
CNameTextField.setEditable(true);  // set editable text box 

CIDLabel=new JLabel("Customer ID"); 

C_IDTextField = new JTextField (10); 
C_IDTextField.setEditable(true);  // set editable text box 

topPanel.add(CNameTextField); 
topPanel.add(C_IDTextField); 

// Create and populate Room type combo box 
roomTypeCombo = new JComboBox(); 
roomTypeCombo.addItem("Budget($50)");  

// Create and populate Meal type combo box 
mealCombo = new JComboBox(); 
mealCombo.addItem("None");  

// Create and populate Days combo box 

daysCombo = new JComboBox(); 

for(int i=0;i<31 ; i++) { 
      // populate combobox with days 
    daysCombo.addItem(i); 
} 
    // Adding rest of the components to top panel 
topPanel.add(roomTypeCombo); 
topPanel.add(mealCombo); 
topPanel.add(daysCombo); 

感謝。

+2

如果我可以使用[MigLayout(http://www.miglayout.com/)太好了這樣的事情,太容易實現:-)或者你可以去[GridBagLayout的] (http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html),只是這個有時候有點難處理:-( – 2012-04-04 17:31:22

回答

5

嘗試更改佈局。 http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

你可以去含有兩行的GridLayout(例如,存在其他一些可能的組合),與含有3分別JComboBoxs,和兩個JTextField每一行。

仔細查看文檔,並查看一些可在網上輕鬆訪問的示例。

import java.awt.GridLayout; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class SwingResizeJFrame { 

    public SwingResizeJFrame() { 
     JTextField TextField1 = new JTextField("firstTextField"); 
     JTextField TextField2 = new JTextField("secondTextField"); 
     JPanel firstPanel = new JPanel(); 
     firstPanel.setLayout(new GridLayout(0, 2, 10, 10)); 
     firstPanel.add(TextField1); 
     firstPanel.add(TextField2); 

     JComboBox comboBox1 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); 
     JComboBox comboBox2 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); 
     JComboBox comboBox3 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); 
     JPanel secondPanel = new JPanel(); 
     secondPanel.setLayout(new GridLayout(0, 3, 10, 10)); 
     secondPanel.add(comboBox1); 
     secondPanel.add(comboBox2); 
     secondPanel.add(comboBox3); 

     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout(2, 1, 10, 10)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(firstPanel); 
     frame.add(secondPanel); 
     frame.pack(); 
     frame.setLocation(150, 150); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       SwingResizeJFrame demo = new SwingResizeJFrame(); 
      } 
     }); 
    } 
} 
+0

我同意,我很着急發佈代碼。謝謝。這不是最好的辦法,可能在調整窗口大小時會出現一些問題嗎?(沒時間去測試) – 2012-04-04 16:37:35

7

最具體的佈局類型是絕對定位。

警告:絕對定位應該很少使用。原因有很多。這裏是一個:Absolute positioning (No layout manager) vs. absolute positioning in MiGlayout

- 感謝用戶brimborium爲增加警告的好主意。

話雖這麼說,這裏是如何使用絕對定位:

在你上面的代碼,而不是設置topPanel的佈局FlowLayout,將其設置爲null

topPanel.setLayout(null); 

後來在代碼中,你開始添加組件topPanel權之前,調用容器的setBounds方法:

someJComponent.setBounds(x-coord, y-coord, width, height); 

因此,例如,您創建的JComboBox()一個實例,並把它命名爲roomTypeCombo ,以下代碼顯示如何絕對定位roomTypeCombo

topPanel.setLayout(null); 

// code... 

roomTypeCombo = new JComboBox(); 

// code... 

roomTypeCombo.setBounds(100, 100, 200, 50); 
topPanel.add(roomTypeCombo); 


setBounds方法,以上所使用,有四個參數:
int x-coord - 設置roomTypeCombo「到它的父,topPanel小號相對X座標。
int y-coord - 設置roomTypeCombo的y座標相對於它的父母,topPanel
int width, int height - 最後兩個參數指定了roomTypeCombo的寬度和高度,這很自我解釋。


我只想玩的座標,看看你喜歡什麼,出來的話,可能發生的最糟糕的事情是,你回去使用佈局,這可能是比絕對定位更好。或者你可以實現你自己的layout manager,如果你按照這個超鏈接,第一個答案會談到實現你自己的佈局管理器,並有有用的鏈接。

對不起,如果我寫的東西無論如何幫助你。

More information on absolute positioning

+1

這個問題的完美答案。我問自己爲什麼選擇其他答案。應該有一個警告,絕對定位在大多數情況下**不是**的方式)。 – brimborium 2013-05-31 07:49:24