Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to align left or right inside GridBagLayout cell?

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

UPDATE

Constructing code (I know I could reuse 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); 
like image 230
Dims Avatar asked Mar 24 '12 12:03

Dims


People also ask

Why do we need layout management what is GridBagLayout?

The Java GridBagLayout class is used to align components vertically, horizontally or along their baseline. The components may not be of the same size. Each GridBagLayout object maintains a dynamic, rectangular grid of cells. Each component occupies one or more cells known as its display area.

How does GridBagLayout work?

Essentially, GridBagLayout places components in rectangles (cells) in a grid, and then uses the components' preferred sizes to determine how big the cells should be. The following figure shows the grid for the preceding applet. As you can see, the grid has three rows and three columns.

Which layout class is used to align components vertically and horizontally or along their baseline?

The GridBagLayout class is a flexible layout manager that aligns components vertically, horizontally or along their baseline without requiring that the components be of the same size.

How to create GridBagLayout in java?

We create 4 JButton components named “java“, “layout“, “manager“, “demo” and then add them to the JFrame by the method add(). We set the size and visibility of the frame by method setSize() and setVisible(). The layout is set by the method setLayout().


2 Answers

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:

   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:

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 ...

like image 135
Hovercraft Full Of Eels Avatar answered Sep 21 '22 14:09

Hovercraft Full Of Eels


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.

like image 41
Jakub Zaverka Avatar answered Sep 21 '22 14:09

Jakub Zaverka