2012-04-04 30 views
6

Cách đặt các thành phần trong bố trí ở vị trí cụ thể. Giống như tôi muốn đặt 2 hộp văn bản ở hàng đầu tiên, bên dưới 3 hộp kết hợp.Làm thế nào để đặt các thành phần tại các vị trí cụ thể?

Nhưng khi tôi cố gắng đặt tất cả chúng xuất hiện trong một dòng và tôi đã sử dụng flowlayout. Tôi đã sử dụng biên giới là tốt. Khi tôi thay đổi kích thước, kích thước cửa sổ của các thành phần đang đi ra khỏi biên giới.

Bạn có thể đề xuất cho tôi một số bố cục để sử dụng và cách sử dụng không?

Đây là mã của tôi:

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); 

Cảm ơn.

+2

Nếu tôi có thể, sử dụng [MigLayout] (http://www.miglayout.com/) quá tốt cho những thứ như vậy, và quá dễ dàng để thực hiện :-) hoặc bạn có thể đi với [GridBagLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html), chỉ một điều này là một chút khó khăn để xử lý đôi khi :-( –

Trả lời

5

Cố gắng thay đổi bố cục. http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

Bạn có thể đi theo số GridLayout với hai dòng (ví dụ: có một số kết hợp khác có thể), với mỗi dòng chứa 3 JComboBox tương ứng và hai JTextField.

Xem kỹ tài liệu và xem một số ví dụ có thể truy cập dễ dàng trên web.

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

Tôi đồng ý.Tôi đã vội vàng để đăng mã Nó không phải là cách tốt nhất để làm điều đó, có lẽ một số vấn đề sẽ xảy ra khi thay đổi kích thước cửa sổ không? (Không có thời gian để kiểm tra mặc dù) –

7

Loại bố cục cụ thể nhất là định vị tuyệt đối.

Cảnh báo: Vị trí tuyệt đối hiếm khi được sử dụng. Có nhiều lý do tại sao. Đây là một: Absolute positioning (No layout manager) vs. absolute positioning in MiGlayout

- Cảm ơn người dùng brimborium vì ý tưởng tốt về việc thêm cảnh báo.

Điều đó đang được nói, đây là cách sử dụng định vị tuyệt đối:

Trong mã của bạn ở trên, thay vì thiết topPanel 's bố trí để FlowLayout, đặt nó vào null.

topPanel.setLayout(null); 

Sau đó trong mã này, ngay trước khi bạn bắt đầu thêm các thành phần để topPanel, gọi phương thức setBounds của container:

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

Vì vậy, ví dụ bạn đã tạo một thể hiện của JComboBox() và đặt tên nó là roomTypeCombo , mã sau đây cho biết cách hoàn toàn vị trí roomTypeCombo.

topPanel.setLayout(null); 

// code... 

roomTypeCombo = new JComboBox(); 

// code... 

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


Phương pháp setBounds, được sử dụng ở trên, có bốn thông số:
int x-coord - thiết lập các roomTypeCombo 's x-phối hợp tương ứng với đó là phụ huynh, topPanel.
int y-coord - đặt tọa độ y của roomTypeCombo tương ứng với phụ huynh đó, topPanel.
int width, int height - Hai thông số cuối cùng chỉ định chiều rộng và chiều cao của roomTypeCombo, khá dễ hiểu.


Tôi sẽ chỉ chơi xung quanh với tọa độ và xem bạn có thích thứ gì không, điều tồi tệ nhất có thể xảy ra là bạn quay lại sử dụng bố cục, có lẽ tốt hơn vị trí tuyệt đối. Hoặc bạn có thể thực hiện layout manager của riêng mình, nếu bạn theo siêu liên kết này, câu trả lời đầu tiên sẽ nói về việc triển khai trình quản lý bố cục của riêng bạn và có các liên kết hữu ích.

Tôi xin lỗi nếu không có gì tôi viết đã giúp bạn.

More information on absolute positioning

+1

Câu trả lời hoàn hảo cho câu hỏi đó.Tôi tự hỏi tại sao câu trả lời khác đã được chọn. nên có một cảnh báo, vị trí tuyệt đối đó trong hầu hết các trường hợp ** không ** cách để thực hiện nó.) – brimborium

Các vấn đề liên quan