Java 如何在 GridBagLayout 单元格内左对齐或右对齐?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9851688/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 12:21:02  来源:igfitidea点击:

How to align left or right inside GridBagLayout cell?

javaswinggridbaglayoutalignment

提问by Dims

I see that GridBagLayoutpositions it's children with center alignment within cells. How to align left or right?

我看到它的GridBagLayout位置是在单元格内居中对齐的孩子。如何左对齐或右对齐?

UPDATE

更新

Constructing code (I know I could reuse c)

构建代码(我知道我可以重用c

    // button panel
    JPanel button_panel = new JPanel();
    button_panel.add(ok_button);
    button_panel.add(cancel_button);

    // placing controls to dialog
    GridBagConstraints c;

    GridBagLayout layout = new GridBagLayout();
    setLayout(layout);

    c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;

    add(inputSource_label, c);

    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 0;
    add(inputSource_combo, c);

    c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 1;
    add(output_label, c);

    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 1;
    add(output_combo, c);

    c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 2;
    c.gridwidth = 2;
    add(button_panel, c);

采纳答案by Hovercraft Full Of Eels

When using GridBagLayout for a tabular display of JLabel : JTextField, I like to have a method that makes my GridBagConstraints for me based on the x, y position. For example something like so:

当将 GridBagLayout 用于 JLabel 的表格显示时:JTextField,我喜欢有一种方法可以根据 x、y 位置为我制作 GridBagConstraints。例如像这样:

   private GridBagConstraints createGbc(int x, int y) {
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = x;
      gbc.gridy = y;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;

      gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST;
      gbc.fill = (x == 0) ? GridBagConstraints.BOTH
            : GridBagConstraints.HORIZONTAL;

      gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS;
      gbc.weightx = (x == 0) ? 0.1 : 1.0;
      gbc.weighty = 1.0;
      return gbc;
   }

The following code makes a GUI that looks like this:

下面的代码使 GUI 看起来像这样:

enter image description here

在此处输入图片说明

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;

public class GridBagEg {
   private static void createAndShowGui() {
      PlayerEditorPanel playerEditorPane = new PlayerEditorPanel();

      int result = JOptionPane.showConfirmDialog(null, playerEditorPane,
            "Edit Player", JOptionPane.OK_CANCEL_OPTION,
            JOptionPane.PLAIN_MESSAGE);
      if (result == JOptionPane.OK_OPTION) {
         // TODO: do something with info

         for (PlayerEditorPanel.FieldTitle fieldTitle : 
            PlayerEditorPanel.FieldTitle.values()) {
            System.out.printf("%10s: %s%n", fieldTitle.getTitle(),
                  playerEditorPane.getFieldText(fieldTitle));
         }
      }
   }

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

@SuppressWarnings("serial")
class PlayerEditorPanel extends JPanel {
   enum FieldTitle {
      NAME("Name"), SPEED("Speed"), STRENGTH("Strength");
      private String title;

      private FieldTitle(String title) {
         this.title = title;
      }

      public String getTitle() {
         return title;
      }
   };

   private static final Insets WEST_INSETS = new Insets(5, 0, 5, 5);
   private static final Insets EAST_INSETS = new Insets(5, 5, 5, 0);
   private Map<FieldTitle, JTextField> fieldMap = new HashMap<FieldTitle, JTextField>();

   public PlayerEditorPanel() {
      setLayout(new GridBagLayout());
      setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createTitledBorder("Player Editor"),
            BorderFactory.createEmptyBorder(5, 5, 5, 5)));
      GridBagConstraints gbc;
      for (int i = 0; i < FieldTitle.values().length; i++) {
         FieldTitle fieldTitle = FieldTitle.values()[i];
         gbc = createGbc(0, i);
         add(new JLabel(fieldTitle.getTitle() + ":", JLabel.LEFT), gbc);
         gbc = createGbc(1, i);
         JTextField textField = new JTextField(10);
         add(textField, gbc);

         fieldMap.put(fieldTitle, textField);
      }
   }

   private GridBagConstraints createGbc(int x, int y) {
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = x;
      gbc.gridy = y;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;

      gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST;
      gbc.fill = (x == 0) ? GridBagConstraints.BOTH
            : GridBagConstraints.HORIZONTAL;

      gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS;
      gbc.weightx = (x == 0) ? 0.1 : 1.0;
      gbc.weighty = 1.0;
      return gbc;
   }

   public String getFieldText(FieldTitle fieldTitle) {
      return fieldMap.get(fieldTitle).getText();
   }

}

In this example, I display the JPanel in a JOptionPane, but it could just as easily be displayed in a JFrame or JApplet or JDialog or ...

在这个例子中,我在 JOptionPane 中显示 JPanel,但它也可以很容易地显示在 JFrame、JApplet、JDialog 或 ...

回答by Jakub Zaverka

For example

例如

public class DimsPanel extends JPanel
{
    public static void main(String[] args){
        JFrame main = new JFrame("Dims");
        JPanel myPanel = new DimsPanel();
        main.setContentPane(myPanel);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setSize(400, 400);
        main.setLocationRelativeTo(null);
        main.setVisible(true);
    }

    JButton ok_button = new JButton("OK"), cancel_button = new JButton("Cancel");
    JLabel inputSource_label = new JLabel("Input source:"), 
                output_label = new JLabel("Output:");
    JComboBox inputSource_combo = new JComboBox(new String[]{"A", "B", "C"}), 
                output_combo = new JComboBox(new String[]{"A", "B", "C"});

    public DimsPanel(){
        super(new BorderLayout());
        Box main = new Box(BoxLayout.Y_AXIS);

        Dimension labelsWidth = new Dimension(100, 0);
        JPanel inputPanel = new JPanel(new BorderLayout()); 
        inputSource_label.setPreferredSize(labelsWidth);
        inputPanel.add(inputSource_label, BorderLayout.WEST);
        inputPanel.add(inputSource_combo);

        JPanel outputPanel = new JPanel(new BorderLayout()); 
        output_label.setPreferredSize(labelsWidth);
        outputPanel.add(output_label, BorderLayout.WEST);
        outputPanel.add(output_combo);
        // button panel
        JPanel button_panel = new JPanel();
        button_panel.add(ok_button);
        button_panel.add(cancel_button);

        main.add(inputPanel);
        main.add(outputPanel);

        add(main, BorderLayout.NORTH);
        add(button_panel);
    }
}

You can run and see it. Resizing works like a charm and the layout code has only 18 lines. The only disadvantage is that you need to specify the width of the labels by hand. If you really don't want to see setPreferredSize() in the code, then be my guest and go with GridBag. But I personally like this code more.

你可以跑过去看看。调整大小就像一个魅力,布局代码只有 18 行。唯一的缺点是您需要手动指定标签的宽度。如果您真的不想在代码中看到 setPreferredSize() ,那么请成为我的客人并使用 GridBag。但我个人更喜欢这段代码。