2017-07-14 57 views
0

我用GUI創建了一個簡單的猜謎遊戲。問題是,無論何時我最大化我的窗口,整個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(); 
    } 
} 
+0

此鏈接對我有幫助: https://stackoverflow.com/questions/144892/how-to-center-a-window-in-java –

+0

您應該閱讀有關https://docs.oracle.com /javase/tutorial/uiswing/layout/index.html - 現在,問題非常廣泛。 – Marco13

+0

如果答案解決了您的問題,請通過檢查其左側的綠色複選標記將其標記爲已接受。 – user1803551

回答

1

您設置FlowLayout

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

這種佈局有沒有垂直對齊的概念,它只會包裹它的內容時出的水平空間。設置對齊僅適用於水平行爲。

我想知道如何將它置於中間,以及如何使它變大。

如果刪除該行隨後的BorderLayout默認CENTER位置將被使用,其中中心,水平和垂直拉伸組件:爲JFrame

enter image description here

0

的默認佈局管理器BorderLayout。撥打window.getContentPane().add(component);或者如果您想輸入更多內容,則window.getContentPane().add(component, BorderLayout.CENTER);會將您的組件添加到窗口的中心。另外,作爲提示,深入研究Layout Manager。你可以通過正確理解他們如何工作,他們做什麼,哪一個更適合哪種情況來構建非常酷的東西。