5

I need to display a single component within a JPanel, and I want to keep that component in bottom right corner at all times. I tried to do it with GridBagLayout:

val infoArea = new TextArea {
  text = "Hello!"
  border = Swing.EmptyBorder(30)
  background = Color.RED
  editable = false
}
val p = new JPanel
p.setLayout(new GridBagLayout)
val c = new GridBagConstraints
c.gridx = 0
c.gridy = 0
c.anchor = GridBagConstraints.LAST_LINE_END
p.add(infoArea.peer,c)
val f = new JFrame
f.setContentPane(p)
f.setVisible(true)

But the text area is at the center for some reason:

enter image description here

What am I doing wrong here?

mKorbel
  • 109,525
  • 20
  • 134
  • 319
Rogach
  • 26,050
  • 21
  • 93
  • 172
  • You haven't read the GridBagLayout tutorial it appears by your code (adding only one component and not adding some dummy components to fill the JPanel, placing things gridx and gridy 0, not setting all pertinent GridBagConstraints...), and you can't expect anything this complex to work without study first. Regardless, I'd use nested JPanels using simpler layouts such as BorderLayouts. – Hovercraft Full Of Eels Oct 26 '11 at 16:34
  • @HovercraftFullOfEels - I expected to have only one cell, and the component to be placed at the bottom-right (by setting anchor constraint). And what other constraints are pertinent here? – Rogach Oct 26 '11 at 16:43
  • weightx, weighty for one, but regardless, if you're only adding one component it can't be done with GridBagLayout. Again, nest JPanels each with its own layout. Again, BorderLayout would work well. – Hovercraft Full Of Eels Oct 26 '11 at 16:46
  • ...it CAN be done with GridBagLayout :) – svaor Oct 26 '11 at 16:57

3 Answers3

8

For example:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.*;

public class LayoutDemo {
   private static void createAndShowGui() {
      JLabel label = new JLabel("Hello");
      label.setOpaque(true);
      label.setBackground(Color.red);

      JPanel bottomPanel = new JPanel(new BorderLayout());
      bottomPanel.add(label, BorderLayout.LINE_END);

      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(bottomPanel, BorderLayout.PAGE_END);
      mainPanel.setPreferredSize(new Dimension(400, 400));


      JFrame frame = new JFrame("LayoutDemo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

enter image description here

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
6
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
frame.add(Box.createGlue(), gbc);

final JTextArea textArea = new JTextArea("SE");
textArea.setPreferredSize(new Dimension(50, 50));
textArea.setOpaque(true);
textArea.setBackground(Color.RED);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
frame.add(textArea, gbc);

frame.setSize(640, 480);
frame.setVisible(true);

...if you realy want to use GridBagLayout

svaor
  • 2,205
  • 2
  • 19
  • 41
0

you have to put a dummy (use Box.createGlue() to make a dummy component) component on gridx = 0 and gridy = 0 and the component you want to put at the bottom right at gridx = 1, gridy = 1.like this