gpt4 book ai didi

Java GridBagLayout : make component align to left

转载 作者:行者123 更新时间:2023-12-03 01:54:01 25 4
gpt4 key购买 nike

我使用 GridBagLayout 有此布局:

public class Example extends JFrame {
public Example() {
Border outline = BorderFactory.createLineBorder(Color.black);
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JPanel pane = new JPanel(gbl);

gbc.weighty = 1.0;
gbc.weightx = 1.0;

JLabel unitLbl = new JLabel("Unit");
unitLbl.setBorder(outline);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(unitLbl, gbc);
pane.add(unitLbl);

JLabel typeLbl = new JLabel("Type");
typeLbl.setBorder(outline);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(typeLbl, gbc);
pane.add(typeLbl);

JTextField unitField = new JTextField();
typeLbl.setBorder(outline);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(unitField, gbc);
pane.add(unitField);

String[] type = {"All", "Verb", "Noun", "Adjective"};
JComboBox<String> comboBox = new JComboBox<String>(type);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(comboBox, gbc);
pane.add(comboBox);


add(pane, BorderLayout.CENTER);
setSize(new Dimension(400, 300));
getContentPane().setBackground(Color.WHITE);
setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}

在这个例子中,运行时,似乎每个组件都位于框架的中心。但我想要的是:

  1. 两个 JLabel(unitLbltypelbl)将位于框架左侧
  2. JTextFieldJComboBox 将分别位于两个 JLabel 的右侧,两者之间有一小段距离。
  3. 此外,我想在网格的位置 (3,0) 添加一个新的 JButton,但该位置的高度为两个 JLabel 高度之和。这意味着,这个按钮的高度在“两行”上。

如何修复此代码以实现此目标?请帮助我。

谢谢:)

最佳答案

像这样的事情应该可以解决问题:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Example extends JFrame {
public Example() {
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JPanel pane = new JPanel(gbl);
gbc.anchor = GridBagConstraints.WEST;

JLabel unitLbl = new JLabel("Unit");
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(3, 3, 3, 30);
gbl.setConstraints(unitLbl, gbc);
pane.add(unitLbl);

JLabel typeLbl = new JLabel("Type");
gbc.gridx = 0;
gbc.gridy = 1;
gbl.setConstraints(typeLbl, gbc);
pane.add(typeLbl);

gbc.weightx = 1.0;
gbc.insets = new Insets(3, 3, 3, 3);

JTextField unitField = new JTextField();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(unitField, gbc);
pane.add(unitField);

String[] type = { "All", "Verb", "Noun", "Adjective" };
JComboBox<String> comboBox = new JComboBox<String>(type);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.NONE;
gbl.setConstraints(comboBox, gbc);
pane.add(comboBox);

final JButton someButton = new JButton("Click me");
someButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(someButton, "You have clicked " + someButton.getText());
}
});

gbc.gridx = 3;
gbc.gridy = 0;
gbc.gridheight = 2;
gbc.fill = GridBagConstraints.VERTICAL;
pane.add(someButton, gbc);
add(pane, BorderLayout.CENTER);
setSize(new Dimension(400, 300));
getContentPane().setBackground(Color.WHITE);
setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}
  • 您需要适当使用weightx/weighty(额外的水平/垂直空间如何重新分配)
  • 使用适当的 fill 属性(组件是否垂直/水平/同时拉伸(stretch)?)
  • 使用适当的 anchor 属性(如果组件未拉伸(stretch),或至少未在两个方向上拉伸(stretch),则它应位于单元格内的何处)
  • 我通常更喜欢使用插图而不是填充,因此,我更喜欢 insets 而不是 ipadx/ipady(应在组件周围或组件内部添加额外的空白)组件)

关于Java GridBagLayout : make component align to left,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com