[英]placing components using GridBagLayout() is not giving desired result
我想創建一個數據輸入標簽,如下所示,並帶有幾個按鈕:
其中所有文本字段的寬度為3,則“名稱”和“已付金額”的高度為1,而地址的高度為3。它們之間的垂直間隙為1行。
為此,我編寫了以下代碼:(將data_panel與button_panel分開,以便獲得更好的組件放置)
private JLabel label_name;
private JTextField text_name;
private JLabel label_address;
private JTextField text_address;
private JLabel label_amount_paid;
private JTextField text_amount_paid;
private JButton button_add_member;
private JButton button_remove_member;
private JButton button_remove_all;
public TabPanesAddRemove() {
setLayout(new GridLayout(2, 1));
JPanel data_panel = new JPanel(new GridBagLayout()); // data entry panel
GridBagConstraints gbc = new GridBagConstraints();
// gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth = 1;
label_name = new JLabel("Name: ");
data_panel.add(label_name, gbc);
text_name = new JTextField(20);
text_name.setName("name");
gbc = new GridBagConstraints();
// gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 2;
gbc.gridy = 1;
gbc.gridwidth = 3;
data_panel.add(text_name, gbc);
label_address = new JLabel("Address: ");
gbc = new GridBagConstraints();
// gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 3;
gbc.gridwidth = 1;
data_panel.add(label_address, gbc);
text_address = new JTextField(20);
text_address.setName("address");
gbc = new GridBagConstraints();
// gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 2;
gbc.gridy = 3;
gbc.gridwidth = 3;
gbc.gridheight = 3;
data_panel.add(text_address, gbc);
label_amount_paid = new JLabel("Amount Paid: ");
gbc = new GridBagConstraints();
// gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 7;
gbc.gridwidth = 1;
// gbc.gridheight = 1;
data_panel.add(label_amount_paid);
text_amount_paid = new JTextField(20);
text_amount_paid.setName("amount");
gbc = new GridBagConstraints();
// gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 2;
gbc.gridy = 7;
gbc.gridwidth = 3;
data_panel.add(text_amount_paid);
add(data_panel);
JPanel buttons_panel = new JPanel(); // button panel
button_add_member = new JButton(BUTTON_ADD);
button_remove_member = new JButton(BUTTON_REMOVE);
button_remove_all = new JButton(BUTTON_REMOVE_ALL);
buttons_panel.add(button_add_member);
buttons_panel.add(button_remove_member);
buttons_panel.add(button_remove_all);
add(buttons_panel);
Event ev = new Event();
button_add_member.addActionListener(ev);
button_remove_member.addActionListener(ev);
button_remove_all.addActionListener(ev);
}
這段代碼給了我如下輸出:
仔細觀察:
我嘗試了各種更改,包括使用gbc.fill
以及JTextField()
, gbc.gridx
和gbc.gridy
等中的不同尺寸。但是我無法獲得期望的結果。
有人可以幫我解決問題嗎?
也許這會幫到你。 我知道它並不完全是您想要的東西,但是我猜它演示了如何很好地使用GB布局:
public class MainF extends JFrame {
public static void main(String[] args) {
MainF f = new MainF();
f.setVisible(true);
}
public MainF() {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setBounds(100, 100, 600, 300);
Dimension tfSize = new Dimension(200, 25);
JPanel dataP = new JPanel();
dataP.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JLabel label = new JLabel("Name:");
c.gridx = 1;
c.gridy = 1;
c.anchor = GridBagConstraints.NORTHEAST;
dataP.add(label, c);
JTextField tf = new JTextField(30);
tf.setMinimumSize(tfSize);
tf.setMaximumSize(tfSize);
tf.setPreferredSize(tfSize);
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 1;
c.gridwidth = 3;
dataP.add(tf, c);
label = new JLabel("Address:");
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 2;
c.anchor = GridBagConstraints.NORTHEAST;
dataP.add(label, c);
tf = new JTextField(30);
tf.setMinimumSize(tfSize);
tf.setMaximumSize(tfSize);
tf.setPreferredSize(tfSize);
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 2;
c.gridwidth = 3;
dataP.add(tf, c);
label = new JLabel("Amount Paid:");
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 3;
c.anchor = GridBagConstraints.NORTHEAST;
dataP.add(label, c);
tf = new JTextField(30);
tf.setMinimumSize(tfSize);
tf.setMaximumSize(tfSize);
tf.setPreferredSize(tfSize);
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 3;
c.gridwidth = 3;
dataP.add(tf, c);
JButton button = new JButton("Add Member");
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 5;
dataP.add(button, c);
button = new JButton("Remove Member");
c = new GridBagConstraints();
c.gridx = 3;
c.gridy = 5;
dataP.add(button, c);
button = new JButton("Remove All Members");
c = new GridBagConstraints();
c.gridx = 4;
c.gridy = 5;
dataP.add(button, c);
this.add(dataP);
}
}
問題是,當您添加label_amount_paid
和text_amount_paid
時,您忘記了傳遞GridBagConstraints
label_amount_paid = new JLabel("Amount Paid: ");
gbc = new GridBagConstraints();
//...
data_panel.add(label_amount_paid); // Missing constraints
text_amount_paid = new JTextField(20);
text_amount_paid.setName("amount");
gbc = new GridBagConstraints();
//...
data_panel.add(text_amount_paid); // Missing constraints
請記住,默認情況下,x / y位置基於0。
label_amount_paid = new JLabel("Amount Paid: ");
gbc = new GridBagConstraints();
//...
data_panel.add(label_amount_paid, gbc);
text_amount_paid = new JTextField(20);
text_amount_paid.setName("amount");
//...
gbc = new GridBagConstraints();
data_panel.add(text_amount_paid, gbc);
我也會非常注意gridWidth
和gridHeight
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.