Silent Beast
Silent Beast

Reputation: 119

Centering GUI's

I've created a simple guessing game with GUI's. The problem is, whenever I maximize my window, the whole GUI is stuck in the top middle. I would like to know how to center it in the middle and how to make it bigger. Here's the code:

 import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;


     public class GuessingGameNew implements ActionListener {
       private final double VERSION = 2.3;
       //Initializing Main Window and Difficulty Window
       JFrame window = new JFrame("Guess The Number " + VERSION);
        JFrame DiffFrame = new JFrame("Difficulty");


    JButton btnNewGame = new JButton("New Game");
    JButton btnInstruction = new JButton("Instructions");
    JButton btnDifficulty = new JButton("Change Difficulty");
    JButton btnAbout = new JButton("About");
    JButton btnExit = new JButton("Exit");
    JButton btnOK = new JButton("Ok");
    JButton btnDiff[] = new JButton[6];

    //Making Panel for Main Menu Buttons
    JPanel pnlMainMenu = new JPanel();
    //Making Panel for Difficulty Buttons
    JPanel pnlDifficulty = new JPanel();


    int diff = 10;
    int tries;
    int Secret;
    int Guess;
    int option = 0;
    boolean Cancel = false;

    GuessingGameNew()   { //constructor
        //Setting Main Window properties
        window.setSize(400, 300);
        window.setLocation(500, 260);   
        window.setLayout(new FlowLayout(FlowLayout.CENTER));
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        DiffFrame.setSize(230, 210);
        DiffFrame.setLocation(530, 230);    
        DiffFrame.setLayout(new BorderLayout());
        //MainMenu Panel Layout and adding Main Menu Buttons     
        //                                GridLayout(int rows, int columns, int Horizontal_Gap, intVertical_Gap)
        pnlMainMenu.setLayout(new GridLayout(5, 1, 2, 8));
        pnlMainMenu.add(btnNewGame);
        pnlMainMenu.add(btnInstruction);
        pnlMainMenu.add(btnDifficulty);
        pnlMainMenu.add(btnAbout);
        pnlMainMenu.add(btnExit);
        pnlMainMenu.setBackground(Color.red);
        //Setting Layout for Difficulty Panel
        pnlDifficulty.setLayout(new GridLayout(6, 1, 2, 2));


        btnDiff[0] = new JButton("Very Easy (0 - 3)");
        btnDiff[1] = new JButton("Easy (0 - 50)");
        btnDiff[2] = new JButton("Medium (0 - 100)");
        btnDiff[3] = new JButton("Hard (0 - 500)");
        btnDiff[4] = new JButton("Very Hard (0 - 1000)");
        btnDiff[5] = new JButton("Custom (0 - ?)");


        btnNewGame.addActionListener(this);
        btnInstruction.addActionListener(this);
        btnDifficulty.addActionListener(this);
        btnAbout.addActionListener(this);
        btnExit.addActionListener(this);
        btnOK.addActionListener(this);


        for(int i=0; i<6; i++)  {
            btnDiff[i].addActionListener(this);
            pnlDifficulty.add(btnDiff[i]);
        }

        window.add(pnlMainMenu);
        window.setVisible(true);
    }

    public void actionPerformed(ActionEvent click)  {
        System.out.println("Action Performed");
        if(click.getSource() == btnNewGame) {
            NewGame();
        }
        if(click.getSource() == btnExit)    {
            option = JOptionPane.showConfirmDialog(null, "Are you sure you want to exit?", "Exit Game" ,JOptionPane.YES_NO_OPTION);
            if(option == JOptionPane.YES_OPTION)
                System.exit(0);
        }
        if(click.getSource() == btnInstruction) {
            JOptionPane.showMessageDialog(null,
            "Game:" + "\nClick New Game to start a new game.\nGuess a number between 0 and the selected number. Keep Guessing until you get it correct."
            + "\n\nDifficulty:" + "\nYou can change the difficulty of the game\n in the Main Menu to a Custom range or a \npreset range."
            , "Instructions", JOptionPane.INFORMATION_MESSAGE);
        }
        if(click.getSource() == btnAbout)   {
            JOptionPane.showMessageDialog(null,JOptionPane.INFORMATION_MESSAGE);
        }
        if(click.getSource() == btnDifficulty)  {
            Change_Difficulty();
        }
        for(int i=0; i<6; i++)  {
            if(click.getSource() == btnDiff[i]) {
                if(click.getSource() == btnDiff[0])
                    diff = 3;
                if(click.getSource() == btnDiff[1])
                    diff = 50;
                if(click.getSource() == btnDiff[2])
                    diff = 100;
                if(click.getSource() == btnDiff[3])
                    diff = 500;
                if(click.getSource() == btnDiff[4])
                    diff = 1000;
                if(click.getSource() == btnDiff[5])
                    diff = Custom();
                DiffFrame.setVisible(false);
            }
        }
    }

    public void NewGame()   {
        tries = 1;
        Guess = 101;
        Secret = (int)((Math.random()) * (diff + 1));
        Cancel = false;

        while(Guess != Secret)  {
            try {
                if(tries == 1)  {
                    Guess = Integer.parseInt(JOptionPane.showInputDialog(null, "Try: 1" + "\nGuess a number between 0 and " + diff, "Guess?", JOptionPane.PLAIN_MESSAGE));

                    tries++;
                }   else    {
                    if(Guess > Secret)
                        Guess = Integer.parseInt(JOptionPane.showInputDialog(null, "Try: " + tries + "\n" + Guess + "\nGuess Lower..."));
                    else if(Guess < Secret)
                        Guess = Integer.parseInt(JOptionPane.showInputDialog(null, "Try: " + tries + "\n" + Guess + "\nGuess Higher..."));
                    tries++;
                }
            } catch(NumberFormatException e)    {
                if(e.getMessage() == "null")    {
                    option = JOptionPane.showConfirmDialog(null, "Are you sure you want to go back to the Main Menu?", "Cancel?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                    if(option == JOptionPane.YES_OPTION)    {
                        Cancel = true;
                        break;
                    }
                }
                JOptionPane.showMessageDialog(null, "Error: " + e.getMessage() + "\nEnter whole numbers only!");
            }
        }
        if(!Cancel) {
            tries--;
            JOptionPane.showMessageDialog(null, Guess + " is Correct!!\nYou WON in " + tries + " tries.", "Winner", JOptionPane.INFORMATION_MESSAGE);
            option = JOptionPane.showConfirmDialog(null, "Do you want to try again?", "Try Again?", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);
            if(option == JOptionPane.YES_OPTION)
                NewGame();
        }
    }

    public void Change_Difficulty() {
        DiffFrame.add(pnlDifficulty, BorderLayout.CENTER);
        DiffFrame.setVisible(true);
    }

    public int Custom() {
        try {
            diff = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter a number that you want to be the range (0 to ?)", diff));
        } catch(NumberFormatException e)    {

        }
        return diff;
    }

    public static void main(String[] args)  {

        new GuessingGameNew();
    }
}

Upvotes: 0

Views: 93

Answers (2)

jaletechs
jaletechs

Reputation: 571

The default Layout Manager for a JFrame is the BorderLayout. Calling window.getContentPane().add(component); or if you feel like typing more, then window.getContentPane().add(component, BorderLayout.CENTER); adds your component to the center of the window. Also, as a tip, do study Layout Managers deeply. You can build really cool stuff with the proper understanding of how they work, what they do, and which one is more appropriate for which scenario.

Upvotes: 0

user1803551
user1803551

Reputation: 13408

You are setting a FlowLayout:

window.setLayout(new FlowLayout(FlowLayout.CENTER));

This layout has no notion of vertical alignment, it will only wrap its contents when out of horizontal space. Setting the alignment applies only to horizontal behavior.

I would like to know how to center it in the middle and how to make it bigger.

If you delete that line then the default CENTER position of BorderLayout will be used, which centers and stretches the component both horizontally and vertically:

enter image description here

Upvotes: 1

Related Questions