Reputation: 31262
In the below code, I am using gridbaglayout to have all my buttons displayed in two lines on a frame size of 600 X 400. Commenting out setSize() or pack() in the below code did not help. my question is how to get frame of size 600 X 400, and the bottom of frame has a panel with alpabet buttons. Thanks for help.
import javax.swing.*;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.event.*;
public class HangmanGUI {
public static void main(String[] args){
new HangmanGUI();
}
//constructor for Hangman
/**
* Instantiates a new hangman gui.
*/
public HangmanGUI() {
JFrame myframe= new JFrame();
JPanel myPanel = new JPanel();
myPanel.setLayout(new GridLayout());
GridBagConstraints gbc = new GridBagConstraints();
myframe.setSize(600,400);
int x =0; int y=5;
for (char alphabet = 'A';alphabet<='Z';alphabet++){
gbc.gridx=x;
gbc.gridy=y;
myPanel.add(new JButton(alphabet+""),gbc);
x++;
if (x>15){
y =6;x=0;
}
}
myframe.add(myPanel);
myframe.pack();
myframe.setTitle("Hangman Game");
myframe.setVisible(true);
myframe.setLocationRelativeTo(null);
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Upvotes: 0
Views: 3287
Reputation: 347314
When packed, the frame size is computed based on the preferred size of it's content pane.
Personally, I'd care less about the window size and the functionality of the program and let the underlying framework figure it all out...but, if it's important to you...
Start with, something like, a JPanel
and override it's getPreferredSize
method...
public class BigPane extends JPanel {
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
}
Set this panel as the frame's content pane...
JFrame myframe= new JFrame();
myFrame.setContentPane(new BigPane());
// This is important as the panels default layout is FlowLayout...
myFrame.setLayout(new BorderLayout());
If you want you button pane to positioned in the south position, then you simply need to supply the correct layout constraint for the layout, in this case, BorderLayout
...
myFrame.add(myPanel, BorderLayout.SOUTH);
This will allow you to add a "main" component to the CENTER
position.
As has already being suggested, it might be better to use a GridLayout
for the buttons, but this will depend on what you want to achieve.
Take a look at Laying out components within a container for more details
Upvotes: 1
Reputation: 168845
In your last Q&A you were advised to use GridLayout
as opposed to GridBagLayout
. GridBagConstraints
are only used in the latter.
This is probably not how you want the GUI to look, but take it as a basic guide of what GridLayout
is actually good for.
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
public class HangmanGUI {
/**
* Instantiates a new hangman gui.
*/
public HangmanGUI() {
JPanel gui = new JPanel(new BorderLayout(2,2));
BufferedImage bi = new BufferedImage(
600,200,BufferedImage.TYPE_INT_RGB);
gui.add(new JLabel(new ImageIcon(bi)));
JFrame myframe= new JFrame();
JPanel myPanel = new JPanel();
gui.add(myPanel,BorderLayout.PAGE_END);
myPanel.setLayout(new GridLayout(2,0,0,0));
int x =0; int y=5;
for (char alphabet = 'A';alphabet<='Z';alphabet++){
myPanel.add(new JButton(alphabet+""));
x++;
if (x>15){
y =6;x=0;
}
}
myframe.add(gui);
myframe.pack();
myframe.setTitle("Hangman Game");
myframe.setVisible(true);
myframe.setLocationRelativeTo(null);
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
new HangmanGUI();
}
}
Upvotes: 1
Reputation: 87
JFrame myframe= new JFrame();
myframe.getContentPane().setLayout(new BorderLayout());
JPanel myPanel = new JPanel();
myPanel.setLayout(new GridLayout(2,13));
GridBagConstraints gbc = new GridBagConstraints();
myframe.setSize(600,400);
int x =0; int y=5;
for (char alphabet = 'A';alphabet<='Z';alphabet++){
gbc.gridx=x;
gbc.gridy=y;
myPanel.add(new JButton(alphabet+""),gbc);
x++;
if (x>15){
y =6;x=0;
}
}
myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
myframe.setTitle("Hangman Game");
myframe.setVisible(true);
myframe.setLocationRelativeTo(null);
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
I added the BorderLayout to the ContentPane and then added the Panel to the bottom of the ContentPane.
Also removed the pack.
And added the constraints in your new GridLayout to specify 2 rows of 13 columns
Upvotes: 0