How to fill JFrame window with a JPanel? - java

I am trying to set a JPanel fill the whole window of a JFrame. The layout of JPanel is GridBagLayout. If i change it to BorderLayout it works. But i need the GridBagLayout and in this way the JPanel appears on the Center of the window.
How can i fill the whole window of JFrame with the JPanel( just like with BorderLayout )?

First, make sure you read How to Use GridBagLayout
Next, make sure you have the JavaDocs for GridBagConstraints open and available
These two basic references will provide you with 99% of the information you need to answer just about most of you issues.
Without more context, something like...
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
will achieve the result you're looking for
Remember though, you are not stuck to a single layout manager, you can use multiple containers all using different layout managers to achieve your desired results

Related

How to add an array of objects to a JFrame or a JPanel in Netbeans?

I am developing an ant simulator for my final year project. Here is a design of my work:
The problem is since I can't find a way to add an array of objects into a JFrame or a JPanel, or arrange objects into an array. Source code are protected by Netbeans so I can't even modify it manually. Is there any way to add arrays of objects, or is there any other way to do the grid world?
You can use a GridBagLayout. With GridBagConstraints you can control the placement of JComponents.
JPanel pane = new JPanel(new GridBagLayout());
GridBagConstraints cons = new GridBagConstraints();
cons.gridx = 2;
cons.gridy = 2;
pane.add(theComponent, cons);
It is also possible to use the GridBagLayout in Netbeans UI editor.

Placing GridLayout JPanels onto a GridBagLayout JFrame

I'm trying to place two JPanels onto a JFrame using GridBagLayout.
The first JPanel uses gridLayout to create 35 columns and 27 rows of JButtons, and should have a width of 3/4 of the JFrame. This panel needs to fill the vertical space available to it.
The second JPanel also uses gridLayout and should fill the last 1/4 of the main JFrame.
Unfortunately, my first JPanel (sPan) isn't even fitting properly on the screen, and is forcing the whole second JPanel (cPan) off of the screen. How can I constrain these values to take up only their allowed proportion on the screen without them moving each other around?
If I use a blank JPanel with a background colour with my code, everything works out perfectly fine:
[1]
However, when I use my JPanel consisting of JButtons, the proportions get completely messed up:
[2]
I speculate that when I instantiate my sPan object, it's sizing each button to accommodate the size of the whole JFrame. Then when I instantiate the cPan object and try to place it next to the sPan object, the buttons aren't resizing themselves to accommodate the additional panel in the main JFrame. Does anybody know how I can fix this?
I have to use GridBagLayout for this assignment, so using normal gridLayout isn't an option.
Any tips regarding what's happening would be appreciated.
Could you simply deal with two columns? The first one taking 5/6 of the available width and the second one taking the 1/6th remaining?
You could try the following:
final JPanel sPan = new JPanel();
sPan.setBackground(Color.RED);
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 5 / 6f; // change this value...
constraints.weighty = 1.00;
add(sPan, constraints);
final JPanel cPan = new JPanel();
cPan.setBackground(Color.BLUE);
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1 / 6f; // ... and this one.
constraints.weighty = 1.00;
add(cPan, constraints);
Please note: I replaced your JPanels by some empty JPanels with a background color, so even like this you can see what's going on.

Center JTextField (not the text inside the field!)

How can I center a JTextField.
NOTE! I do not want to center the text in the JTextField (which is achieved using setHorizontalAlignment(JTextField.CENTER), but rather I want to center the actual JTextField in the space it is in, just as jLabel.setHorizontalAlignment(SwingConstants.CENTER) would do.
I recommend using GridBagLayout for this.
panel.setLayout(new GridBagLayout());
GridBagConstraints center = new GridBagConstraints();
center.anchor = GridBagConstraints.CENTER;
center.fill = GridBagConstraints.NONE;
panel.add(textField, center);
Null Layout: This indicates no Layout. Items must be manually positioned and arranged. This layout should only be used if the window
will not and cannot be resized, as the item in the window will stay
where they are placed... http://www.tech-recipes.com/rx/1205/java-null-layout-manager-swing/
http://www.tech-recipes.com/rx/1205/java-null-layout-manager-swing/
http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html
The first link used .setLocation(x, y) to position the controls and the second link used .setBounds(...). You'll need to do the centering yourself

Java Swing Panel Size

Hi I have been learning Java Swing for creating a chess game to practice my Java programming skills.
I've added a JPanel to the east of the JFrame with BorderLayout and I've used the setPrefferedSize(new Dimension(x,y)) method to set the width and height.
After that I have created 4 JPanel and added them with BoxLayout on the previously created panel.
I have tried to set the size of the 4 panels with the setSize(x,y) and setPreferredSize(new Dimension(x,y)) but it dosent work the 4 panels automaticly changed there size to fit the main JPanel and after adding a JLabel on one of them the size of it increased automaticly .
This is my code:
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JPanel a = new JPanel();
a.setPreferredSize(new Dimension(50, 50)); //this dosent work
a.add(min);
a.setBackground(Color.red);
this.add;
JPanel b = new JPanel();
b.setBackground(Color.blue);
this.add(b);
JPanel c = new JPanel();
this.add(c);
JPanel d = new JPanel();
d.setBackground(Color.black);
this.add(d);
How can I change the size of each of these panels?
BoxLayout is best for laying out components with varying sizes along a single axis. From the Javadocs:
"BoxLayout attempts to arrange components at their preferred widths (for horizontal layout) or heights (for vertical layout)."
The idea is that they may have different heights (for a horizontal layout) and it will take the maximum height. And, they definitely may have different widths. Also, BoxLayout works with some, er, "interesting" filler pieces like Box.createHorizontalGlue(). These are actually quite useful for flexible, resizeable layouts once you get the hang of it. But, all in all, BoxLayout is for flexible, resizable layout of items with differing sizes.
For simpler cases, especially if you want both preferred width and preferred height to be "respected", use GridLayout as everybody else has suggested.

Using Java and its SWING library

I am trying to code a very simple form using java but i am running into more trouble than i expected because of the way swing lays out components, I have tried various different layout managers and still cannot layout the form the way i would like.
Here is how i would like the form to look: link text
Does anyone have any ideas about how to go about this because im stumped?
Thanks.
The easiest for your purposes is the GridLayout. As Aaron said, Netbeans has a great GUI builder if you don't want to learn the layout managers.
Take a look at Table Layout. It is much easier to use than nearly all of the default layout managers. Your form would be very simple to construct with it.
Short of using gridbaglayout, it is doable by borderlayout, gridlayout and flowlayout. Start by breaking the form into big visual pieces and make sub layouts under top level ones.
For example, in this case I would do this:
Divide the form in two vertical pieces by gridlayout (or borderlayout); top (or central) part for the labels and textfields, bottom (or south) for the button.
In top part, make either flowlayout with center align or another gridlayout to arrange the labels and textfields.
In the bottom part, use flowlayout with center align for the button.
I have worked with Java swing for 4 years and it was a hurdle to design layouts at first, but it gets easier the more you practise.
GridBagLayout can be daunting at first, but it's very flexible, and is worth getting to know.
JButton button = ...;
JLabel[] labels = new JLabel[] {
new JLabel("Label 1"),
...
};
JTextField[] fields = new JTextField[] {
new JTextField(15),
...
};
JPanel[] rows = new JPanel[] {
new JPanel(),
...
}
Container container = getContentPane();
container.setLayout(new GridBagLayout());
GridBagConstraints cons = new GridBagConstraints();
// Layout each row's contents(label + text field)
cons.fill = GridBagConstraints.BOTH;
cons.insets = new Insets(2, 8, 2, 8);
for (int i = 0; i < rows.length; ++i) {
rows[i].setLayout(new GridBagLayout());
// Labels get 30% of the row's extra horizontal space.
cons.weightx = 0.3;
rows[i].add(labels[i], cons);
// Text fields gets 70% of the row's extra horizontal space.
cons.weightx = 0.7;
rows[i].add(fields[i], cons);
// Add each row to the panel, top to bottom
// Each row takes up all of the horizontal space.
cons.gridx = 0;
cons.weightx = 1;
container.add(rows[i], cons);
cons.gridx = GridBagConstraints.RELATIVE;
}
// Add the button at the bottom.
// Dont let button get any extra horizontal space (so it won't stretch)
cons.gridx = 0;
cons.weightx = 0;
cons.fill = GridBagConstraints.NONE;
container.add(button, cons);
By far the easiest to use layout manager I've tried, at least for doing something similar to that, is DesignGridLayout. With that, the code would look something like:
layout.row().grid(new JLabel("JLabel1")).add(new JTextField());
layout.row().grid(new JLabel("JLabel2")).add(new JTextField());
...
layout.row().grid(new JLabel("JLabel5")).add(new JTextField());
layout.row().center().add(new JButton("JButton"));
A form like that should be very easy to design and code by hand. Just keep reading the documentation and playing around.
Another alternative is to use a GUI Builder, Netbeans has one that really impressed me when I took a look at it last year. I don't work in Java anymore so I can't provide you with much detail.
Netbeans GUI Builder (Formerly Matisse)
I would recommed you to use NetBeans.
It's much easier since it generates code with layout manager included, so you don't have to worry about it. It's good for beginners.
I'd do a main Panel with a BorderLayout.
The south area would hold a panel with the button in it.
The center area would hold a panel with a grid layout, grid bag layout or some kind of box layout that would lay your labels and text boxes out.
I really like the JGoodies Forms tool for laying out simple (and complex) forms. It's easy to work with and has great examples. If you want something really nice looking, you can use one of their look and feels too.

Categories

Resources