Re: Simple BorderLayout problem
On 2/15/2010 8:50 AM, Fencer wrote:
Hello, I have a problem with BorderLayout, and I bet it's really simple.
I have JPanel with a TitledBorder (like a "group" widget) and this
JPanel contains a button.
Now I want to displays this JPanel centered horizontally and vertically
and I don't want it to occupy all the space of the client area of the
JFrame.
I tried this:
package main;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
public class CenteredGroup {
CenteredGroup() {
frame.setSize(1024, 768);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = (JPanel)frame.getContentPane();
BorderLayout borderLayout = new BorderLayout(50, 50);
frame.setLayout(borderLayout);
contentPane.setLayout(borderLayout);
There is no need to set both the JFrame layout and the ContentPane layout.
JPanel groupPanel = new JPanel();
groupPanel.setBorder(new TitledBorder("This is my group text."));
JButton button = new JButton("A button");
groupPanel.add(button);
contentPane.add(groupPanel, BorderLayout.CENTER);
frame.setVisible(true);
}
public static void main(String[] args) {
new CenteredGroup();
}
JFrame frame = new JFrame("Centered Group");
}
A little indentation would be nice.
However, the "group control" occupies the entire client area of the
frame. Why?
I can provide a screenshot of what it looks like and how I want it to
look like if you have trouble understanding my problem description.
- F
BorderLayout causes the components added to it to fill the available
area. Specifying the hgap and vgap just put extra space between
components not the outer edges. Use a layout that will not do that such
as GridBagLayout. GBL also has the ability to adjust the size and
positions of components.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class test8 extends JPanel {
public test8() {
setPreferredSize(new Dimension(40,30));
setBackground(Color.BLUE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridBagLayout());
test8 t8 = new test8();
f.add(t8);
f.setSize(400,300);
f.setVisible(true);
}
});
}
}
And this one is a button centered in a JPanel, centered in the JFrame.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class test9 extends JPanel {
public test9() {
super(new GridBagLayout());
setPreferredSize(new Dimension(160,120));
JButton b = new JButton("Press Me");
add(b);
setBorder(BorderFactory.createLineBorder(Color.BLUE,10));
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridBagLayout());
test9 t9 = new test9();
f.add(t9);
f.setSize(800,600);
f.setVisible(true);
}
});
}
}
It is trivial with GBL to align the JPanel to the upper left corner of
the JFrame.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class test9 extends JPanel {
public test9() {
super(new GridBagLayout());
setPreferredSize(new Dimension(160,120));
JButton b = new JButton("Press Me");
add(b);
setBorder(BorderFactory.createLineBorder(Color.BLUE,10));
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.NORTHWEST;
c.weightx = c.weighty = 1.0;
test9 t9 = new test9();
f.add(t9,c);
f.setSize(800,600);
f.setVisible(true);
}
});
}
}
--
Knute Johnson
email s/nospam/knute2010/