java - 居中 GUI

标签 java swing layout-manager

我用 GUI 创建了一个简单的猜谜游戏。问题是,每当我最大化窗口时,整个 GUI 都会卡在顶部中间。我想知道如何将其居中以及如何使其变大。代码如下:

 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();
    }
}

最佳答案

您正在设置 FlowLayout :

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

此布局没有垂直对齐的概念,只有在超出水平空间时才会换行其内容。设置对齐方式仅适用于水平行为。

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

如果删除该行,则默认的 CENTER 位置 BorderLayout将使用,它水平和垂直居中并拉伸(stretch)组件:

enter image description here

关于java - 居中 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45111156/

相关文章:

java - 分类层次结构表示格式

java - 带反斜杠转义的字符串的正则表达式

java - actionPerformed 按钮上的异常

java - 按钮和文本字段的大小不符合我的设置

Java ArrayList不使用重写equals(Object o)方法进行比较

java - 如何在log4j中打印自定义前缀

java - 在java中的for循环上运行JTabbedPanel

java - 3 秒后在监听器内释放一个帧

java - 如何更改 JFrame 中 JLabel 的位置?

java - 使用 MigLayout 调整组件和字体的大小