Reputation: 200
I've been searching for about 2 hours, and reading methods and tutorials, but for some reason my program still doesn't behave as expected.
I want to put that panel which contains a box which contains some buttons in the center of the screen. There is a way to do it with RigidBox but it's hard-coded to the size of my current window/screen, and I'd like something that would be centered regardless of where it's opened from.
package layout;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import javax.swing.*;
public class Layout2 {
public static void main(String[] args) {
//The window that opens when you run the application
JFrame mainWindow = new JFrame("Solitare Anca Version 2016");
mainWindow.setSize(1000, 800);
mainWindow.setLocation(460, 140);
//The main menu bar, default in top left of the window it belongs to I think?
JMenuBar mainMenu = new JMenuBar();
//JMenu's=the menus in a bar
JMenu file = new JMenu("Home");
//Items in each menu
JMenuItem save=new JMenuItem("Save progress");
file.add(save);
JMenuItem load=new JMenuItem("Load game");
file.add(load);
JMenuItem savexit=new JMenuItem("Save & exit");
file.add(savexit);
JMenuItem close=new JMenuItem("Close game");
file.add(close);
JMenu options = new JMenu("Options");
JMenuItem changeback=new JMenuItem("Pick another card back");
options.add(changeback);
JMenuItem changecolor=new JMenuItem("Modify background color");
options.add(changecolor);
JMenuItem changelang=new JMenuItem("Change language");
options.add(changelang);
JMenuItem sound=new JMenuItem("Sound options");
options.add(sound);
JMenu help = new JMenu("Help");
JMenuItem rules=new JMenuItem("Rules");
help.add(rules);
//Ading the menus to the bar
mainMenu.add(file);
mainMenu.add(options);
mainMenu.add(help);
JPanel content=new JPanel();
JPanel butPan = new JPanel();
butPan.setBackground(Color.BLACK);
JButton okbut = new JButton("START THE GAME");
JButton exitbut = new JButton(" EXIT ");
Box butBox=Box.createVerticalBox();
butBox.add(okbut);
butBox.add(exitbut);
butPan.add(BorderLayout.SOUTH, butBox);
//Set bg of the main window to the very familiar default green
content.setBackground(Color.decode("#008001"));
content.add(BorderLayout.SOUTH,butPan);
mainWindow.setJMenuBar(mainMenu);
mainWindow.setContentPane(content);
mainWindow.setVisible(true);
// mainWindow.setContentPane(content);
}
}
Here I was just trying different ways to move that damned panel/box but it just won't budge...
Upvotes: 0
Views: 373
Reputation: 1759
EDIT: Recommend checking Andrew Thompson's answer for a code solution.
Just to add to that answer, LayoutManager
is usually the answer to any formatting issues with Swing panels. There are several different managers (ranging vastly, normally trading off simplicity for functionality). Working with core Java/Swing, I'd recommend learning GridBagLayout (Javadoc). It is extremely powerful (if equally verbose), and will let you create virtually any layout you could want. In real-world practice, you'll likely use multiple.
You can learn more about LayoutManager
in general here.
Upvotes: 2
Reputation: 168845
Here are four ways to center a component:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
class CenterComponent {
public static JLabel getLabel(String text) {
return getLabel(text, SwingConstants.LEFT);
}
public static JLabel getLabel(String text, int alignment) {
JLabel l = new JLabel(text, alignment);
l.setBorder(new LineBorder(Color.RED, 2));
return l;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JPanel p = new JPanel(new GridLayout(2,2,4,4));
p.setBackground(Color.black);
p.setBorder(new EmptyBorder(4,4,4,4));
JPanel border = new JPanel(new BorderLayout());
border.add(getLabel(
"Border", SwingConstants.CENTER), BorderLayout.CENTER);
p.add(border);
JPanel gridbag = new JPanel(new GridBagLayout());
gridbag.add(getLabel("GridBag"));
p.add(gridbag);
JPanel grid = new JPanel(new GridLayout());
grid.add(getLabel("Grid", SwingConstants.CENTER));
p.add(grid);
// from @0verbose
JPanel box = new JPanel();
box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS ));
box.add(Box.createHorizontalGlue());
box.add(getLabel("Box"));
box.add(Box.createHorizontalGlue());
p.add(box);
JFrame f = new JFrame("Streeeetch me..");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(p);
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
}
});
}
}
Upvotes: 2
Reputation: 17474
You can try:
mainWindow.setLocationRelativeTo(null);
which when given null
as the parameter will center your JFrame to the centre of your screen.
Also make sure this is called after changing the frame size or packing your frame.
Upvotes: 2