2017-07-14 15 views
0

私はGUIを使って簡単な推測ゲームを作成しました。問題は、私がウィンドウを最大化するたびに、GUI全体がトップミドルに止まってしまうことです。私はそれを真ん中に置く方法とそれをより大きくする方法を知りたいです。ここでは、コードです:あなたはFlowLayoutを設定しているセンタリング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

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

このレイアウトは、垂直配向性の概念を持っていない、それは場合にのみ、水平方向のスペースのうち、その内容をラップします。アラインメントの設定は、水平動作にのみ適用されます。

私はそれを中央に配置する方法と、それをより大きくする方法を知りたいと思います。

あなたがその行を削除した場合、その後BorderLayoutのデフォルトCENTER位置は、水平方向と垂直方向の両方のコンポーネントを中心と伸びており、使用されます。

enter image description here

0

JFrameのデフォルトのレイアウトマネージャですBorderLayoutwindow.getContentPane().add(component);を呼び出すか、moreと入力すると感じる場合は、window.getContentPane().add(component, BorderLayout.CENTER);がコンポーネントをウィンドウの中央に追加します。また、ヒントとして、レイアウトマネージャを深く勉強してください。彼らはどのように働くのか、何をするのか、どのシナリオに適しているのかを正しく理解して、本当にクールなものを作ることができます。