cihangir ND cihangir ND - 3 months ago 42
Java Question

MigLayout, aligning all components at center of JFrame

how can I align my components at JPanel at the center of JFrame.

Here are my codes and what i got

a busy cat

I want like this

a busy cat

MainFrame

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrame extends JFrame {


private static MainFrame instance = new MainFrame();

public static MainFrame getInstance() {
return instance;
}

public static void switchToPanel(JPanel p) {
getInstance().setContentPane(p);
getInstance().validate();
}

private MainFrame() {
setTitle("FavMovies");
setSize(400, 400);
setLocationRelativeTo(null);
setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args) {
MainFrame.switchToPanel(new LoginPanel());
}
}


LoginPanel

import javax.swing.*;
import net.miginfocom.swing.MigLayout;



public class LoginPanel extends JPanel {

// PROPERTIES

private JTextField inputUsername;
private JPasswordField inputPassword;

// CONSTRUCTOR

public LoginPanel() {

setSize(400,400);

// COMPONENTS

inputUsername = new JTextField(10);
inputPassword = new JPasswordField(10);
JButton loginButton = new JButton("Login");
JButton createButton = new JButton( "Create User");

setLayout(new MigLayout());

// first row
add(new JLabel( "Username: "));
add(inputUsername, "wrap 5");

// second row
add(new JLabel( "Password: "));
add(inputPassword, "wrap 10");

// final row
add(loginButton);
add(createButton);


}

}


I hope I could explain :( I hope I could explain :( I hope I could explain :( I hope I could explain :(

Answer

The GridBagLayout will center components automatically. So set the layout of the frame to use a GridBagLayout and then just add your login panel to the frame:

//getInstance().setContentPane(p);
getInstance().setLayout( new GridBagLayout() );
getInstance().add(p);

Edit:

However, when i resize it, i was able to see loginPanel at center.

It looks like you are adding a component to a visible GUI. So you need to manually invoke the layout manager and repaint the component.

getInstance().validate();
getInstance().revalidate();
getInstance().repaint();

The structure of your code is really complicated. You should read the Swing tutorial for better examples and you won't have this problem. Maybe start with the LabelDemo from How to Use Labels.

If you need the ability to swap panels, then take a look at the section from the Swing tutorial on How to Use CardLayout, which was designed for this purpose.