2013-12-16 3 views
1

나는 Random 클래스를 사용하여 Java에서 기본 'guess my number'게임을 사용하고 있지만 첫 번째 GUI에 둘 이상의 창을 만들려고했습니다. 나는 내가 볼 수없는 몇 가지 문제를 가지고 있었고, 스스로 알아 내기 위해 여기 도움의 손길에 왔습니다. 여기다중 클래스 GUI

그가 메인 클래스입니다 :

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

public class GuessMyNumber extends JFrame 
{ 
    private JLabel lblIntro; 
    private JLabel lblPrompt; 
    private JTextField txtInput; 
    private JButton btnSend; 
    private JButton btnCustomize; 
    private JTextField txtMin; 
    private JTextField txtMax; 
    private JButton btnSet; 
    private ButtonListener btnListener; 
    private boolean customize; 
    private boolean game; 
    private int min; 
    private int max; 
    private int dif; 
    private int magicNum; 
    private int num; 
    private int guesses = 1; 

    public GuessMyNumber() 
    { 
     super("Guess My Number"); 
     Container cp = getContentPane(); 
     setLayout(new FlowLayout()); 

     lblIntro = new JLabel("Welcome to Guess My Number"); 
     lblPrompt = new JLabel("Please enter your guess:"); 
     txtInput = new JTextField(15); 
     btnSend = new JButton("Send"); 
     btnSend.addActionListener(new ButtonListener()); 

     btnCustomize = new JButton("Customize Range"); 
     btnCustomize.addActionListener(new ButtonListener()); 

     cp.add(lblIntro); 
     cp.add(lblPrompt); 
     cp.add(txtInput); 
     cp.add(btnSend); 
     cp.add(btnCustomize); 


     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500, 100); 
     setVisible(true); 
    } 
    public static void main(String[]args) 
    { 
     GuessMyNumber foo = new GuessMyNumber(); 
    } 
    public int getMagicNum(int min, int max) 
    { 
     Random g = new Random(); 
     if(customize) 
     { 
      dif = max - min; 
      magicNum = g.nextInt(dif) + min + 1; 
     } 
     else 
     { 
      magicNum = g.nextInt(100) + 1; 
     } 
     return magicNum; 
    } 
    public String getFeedback(int guesses) 
    { 
     String feedback; 
     if(guesses < 4 && guesses > 0) 
      feedback = "Superstar"; 
     else if(guesses < 7 && guesses > 3) 
      feedback = "Pretty Good"; 
     else if(guesses < 10 && guesses > 6) 
      feedback = "Mediocre"; 
     else 
      feedback = "Pathetic"; 
     return feedback; 
    } 
    private class ButtonListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      Object clicked = e.getSource(); 
      if(clicked == btnCustomize) 
      { 
       customize = true; 
       game = false; 
       GUIUtil gui = new GUIUtil(); 
       min = gui.getMin(); 
       max = gui.getMax(); 
      } 
      if(clicked == btnSend) 
      { 
       String feedback; 
       if(!(customize)) 
       { 
        min = 1; 
        max = 100; 
        if(!(game)) 
         magicNum = getMagicNum(min, max); 
        game = true; 
        num = Integer.parseInt(txtInput.getText()); 
        if(num < magicNum) 
         JOptionPane.showMessageDialog(null, "Too low!"); 
        else if(num > magicNum) 
         JOptionPane.showMessageDialog(null, "Too high!"); 
        else 
        { 
         feedback = getFeedback(guesses); 
         JOptionPane.showMessageDialog(null, "Correct!!!\nYou guessed my number in " + guesses + " guesses!\n" + feedback); 
         guesses = 0; 
         game = false; 
        } 
        guesses++; 
       } 
       else 
       { 
        if(!(game)) 
         magicNum = getMagicNum(min, max); 
        game = true; 
        num = Integer.parseInt(txtInput.getText());; 
        if(num < magicNum) 
         JOptionPane.showMessageDialog(null, "Too low!"); 
        else if(num > magicNum) 
         JOptionPane.showMessageDialog(null, "Too high!"); 
        else 
        { 
         feedback = getFeedback(guesses); 
         JOptionPane.showMessageDialog(null, "Correct!!!\nYou guessed my number in " + guesses + " guesses!\n" + feedback); 
         guesses = 0; 
         game = false; 
        } 
        guesses++; 
       } 
      } 

     } 
    } 
} 

그리고 여기에 두 번째 클래스 : 그래서 열 개체를 두 번째 창을 남기면서

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

public class GUIUtil extends JFrame 
{ 
    private JTextField txtMin; 
    private JTextField txtMax; 
    private JButton btnSet; 
    private ButtonListener btnListener; 
    private int min; 
    private int max; 
    private boolean set = false; 

    public GUIUtil() 
    { 
     super("Customization"); 
     Container cp = getContentPane(); 
     setLayout(new FlowLayout()); 

     txtMin = new JTextField("Min", 15); 
     txtMax = new JTextField("Max", 15); 
     btnSet = new JButton("Set"); 
     btnSet.addActionListener(new ButtonListener()); 
     cp.add(txtMin); 
     cp.add(txtMax); 
     cp.add(btnSet); 
     setSize(190,125); 
     setVisible(true); 
    } 
    public int getMin() 
    { 
     if(set = true) 
     { 
      set = false; 
      return min; 
     } 
     else 
     { 
      min = 0; 
      return min; 
     } 
    } 
    public int getMax() 
    { 
     if(set = true) 
     { 
      set = false; 
      return max; 
     } 
     else 
     { 
      max = 100; 
      return max; 
     } 
    } 
    private class ButtonListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      min = Integer.parseInt(txtMin.getText()); 
      max = Integer.parseInt(txtMax.getText()); 
      set = true; 
     } 
    } 
} 

오류가 나는 범위를 정의하려고 시도하고 추측 활성 상태는 다음과 같습니다.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: n mus 
t be positive 
     at java.util.Random.nextInt(Unknown Source) 
     at GuessMyNumber.getMagicNum(GuessMyNumber.java:66) 
     at GuessMyNumber$ButtonListener.actionPerformed(GuessMyNumber.java:127) 
     at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
     at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
     at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
     at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour 
ce) 
     at java.awt.Component.processMouseEvent(Unknown Source) 
     at javax.swing.JComponent.processMouseEvent(Unknown Source) 
     at java.awt.Component.processEvent(Unknown Source) 
     at java.awt.Container.processEvent(Unknown Source) 
     at java.awt.Component.dispatchEventImpl(Unknown Source) 
     at java.awt.Container.dispatchEventImpl(Unknown Source) 
     at java.awt.Component.dispatchEvent(Unknown Source) 
     at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
     at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
     at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
     at java.awt.Container.dispatchEventImpl(Unknown Source) 
     at java.awt.Window.dispatchEventImpl(Unknown Source) 
     at java.awt.Component.dispatchEvent(Unknown Source) 
     at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
     at java.awt.EventQueue.access$200(Unknown Source) 
     at java.awt.EventQueue$3.run(Unknown Source) 
     at java.awt.EventQueue$3.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour 
ce) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour 
ce) 
     at java.awt.EventQueue$4.run(Unknown Source) 
     at java.awt.EventQueue$4.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour 
ce) 
     at java.awt.EventQueue.dispatchEvent(Unknown Source) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
     at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
     at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
     at java.awt.EventDispatchThread.run(Unknown Source) 
+0

무엇이 문제입니까? –

+3

추측 할 필요가없는 문제를 열거 할 수 있습니다. –

+0

죄송합니다. 늦었으므로 그렇게 기억하지는 않습니다. 범위를 사용자 정의한 다음 추측을 시도하면 일련의 예외가 발생합니다. – Andrew

답변

1

GUIUtils을 클래스 GuessNumber 클래스입니다. 생성자에서 인스턴스화하십시오.

public class GuessNumber { 
    GUIUtil utils; 

    public GuessNumber(){ 
     utils = new GUIUtils(); 
    } 
} 

actionPerformed()에서 삭제하십시오. 무슨 일이 일어나고있는 것 같아 actionPerformed()GUIUtils 개체를 만들 때 텍스트 필드에 초기 데이터가 없다고 생각합니다. GUIUtil 개체가 생성 된 직후에 프로그램은 즉시 값이없는 textFields에서 입력을 얻으려고합니다.

+0

감사합니다. – Andrew

+1

코드에서 항상 ifure (set = true) 문을 사용하면 어떻게 작동합니까? !!!!!!!!! –

+0

코드에서 많은 일이 벌어지고 있습니까? 이러한 문을 try catch 블록에서 발견하지 못한 채 어떻게 전달할 수 있었습니까? min = Integer.parseInt (txtMin.getText()); max = Integer.parseInt (txtMax.getText()); set = true; –