2009-12-14 23 views
0

問題: 我無法獲取JTextFields或rollResultTotal的值更新。 即使JTextFields中的數據有效,NumberFormatException仍然會被拋出。Java:滾動程序 - 調試 - 不從有效的信息拋出JTextField和NumberFormatException拋出異常

問題:爲什麼變量不保留?這是由於課堂本身的聲明嗎?是否可以更新JLabel面板以顯示更新的結果? (試過這個,史詩般的失敗)

在此先感謝您的任何輸入和示例。

/* 
    ITP-120:  Final Project 
    Programmer: S. Schnoor 
    Date:  November 7th, 2009 
    Filename: SchnoorProject.java 
    Purpose:  To generate "dice rolls" - a tally of random values as defined by the user, 
       including a final calculation modifier. 
*/ 

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import java.lang.*; 
import java.math.*; 

public class SchnoorProject extends JFrame implements ActionListener, EventListener 
{ 
    // Declare Class Variables 
    int sidesToRoll, diceToRoll, diceLeft, modifier, rollResult, rollResultTotal; 
    String getSides, getDice, getModifier; 
    JTextField inputSides  = new JTextField(); 
    JTextField inputDice  = new JTextField(); 
    JTextField inputModifier = new JTextField(); 
    Random roll; 

    // Panels and Buttons 
    JPanel rollPanel; 
    JButton newRollButton, helpButton, exitButton; 

    // Create Colors 
    Color darkPurple  = new Color (80, 0, 80); 
    Color darkGold   = new Color (255, 215, 0); 
    Color darkCoal   = new Color (24, 24, 24); 
    Color crimson   = new Color (127, 12, 12); 
    Color ltSilver   = new Color (140, 140, 180); 

    public static void main(String args[]) 
    { 
     JFrame frame = new SchnoorProject(); 

     WindowListener l = new WindowAdapter() 
      { 
       public void windowClosing(WindowEvent e) 
       { 
        System.exit(0); 
       } 
      }; 

    frame.addWindowListener(l); 
    frame.pack(); 
    frame.setVisible(true); 

    } 

    public SchnoorProject() 
    { 
     // Construction of Components 
     rollPanel       = new JPanel(); 
     getContentPane().add(rollPanel); 


     JLabel  sidesLabel    = new JLabel ("Enter the number of sides on each die below. (1 to 99)"); 
        sidesLabel.setForeground(darkGold); 
        sidesLabel.setHorizontalAlignment(sidesLabel.CENTER); 

     JTextField inputSides    = new JTextField("6"); 
        inputSides.setBackground(darkCoal); 
        inputSides.setForeground(darkGold); 
        inputSides.setHorizontalAlignment(inputSides.CENTER); 

     JLabel  diceLabel    = new JLabel ("Enter the number of dice to roll below. (1 to 99)"); 
        diceLabel.setForeground(darkGold); 
        diceLabel.setHorizontalAlignment(diceLabel.CENTER); 

     JTextField inputDice    = new JTextField("3"); 
        inputDice.setBackground(darkCoal); 
        inputDice.setForeground(darkGold); 
        inputDice.setHorizontalAlignment(inputDice.CENTER); 

     JLabel  modifierLabel   = new JLabel ("Enter the final modifier below. (-99 to 99)"); 
        modifierLabel.setForeground(darkGold); 
        modifierLabel.setHorizontalAlignment(modifierLabel.CENTER); 

     JTextField inputModifier   = new JTextField("2"); 
        inputModifier.setBackground(darkCoal); 
        inputModifier.setForeground(darkGold); 
        inputModifier.setHorizontalAlignment(inputModifier.CENTER); 

     JButton  newRollButton   = new JButton("ROLL"); 
        newRollButton.setBackground(darkCoal); 
        newRollButton.setForeground(darkGold); 
        newRollButton.addActionListener(this); 

     JButton  helpButton    = new JButton("Help/About"); 
        helpButton.setBackground(darkCoal); 
        helpButton.setForeground(ltSilver); 
        helpButton.addActionListener(this); 

     JButton  exitButton    = new JButton("Exit"); 
        exitButton.setBackground(darkCoal); 
        exitButton.setForeground(crimson); 
        exitButton.addActionListener(this); 

     //Conversions 
        getSides    = inputSides.getText(); 
        getDice     = inputDice.getText(); 
        getModifier    = inputModifier.getText(); 
        sidesToRoll    = Integer.parseInt(getSides); 
        diceToRoll    = Integer.parseInt(getDice); 
        modifier    = Integer.parseInt(getModifier); 
        diceLeft    = diceToRoll; 
        //rollResultTotal  = rollResultTotal; 

     // Paneling 
     rollPanel.setLayout(new GridLayout (3,3)); 
     rollPanel.setBackground(darkPurple); 
     rollPanel.setForeground(darkGold); 
     rollPanel.add(sidesLabel); 
     rollPanel.add(diceLabel); 
     rollPanel.add(modifierLabel); 
     rollPanel.add(inputSides); 
     rollPanel.add(inputDice); 
     rollPanel.add(inputModifier); 
     rollPanel.add(newRollButton); 
     rollPanel.add(helpButton); 
     rollPanel.add(exitButton); 
    } 

    // Implement ActionListener for multiple JButtons 
    public void actionPerformed(ActionEvent e) 
    { 
     String arg = e.getActionCommand(); 
     if ("Help/About".equals(arg)) 
      { 
       JOptionPane.showMessageDialog(null,"This application generates random values, based on the parameters input by the user.\nPlease choose number of dice, sides on each die, and a +/- roll modifier.\nIf no roll modifier is needed, enter 0 (numeric zero) in the modifier field.\n(The starting numbers tell the program to roll 3 six-sided dice and add 2 or '3d6+2'.)","Help/About",JOptionPane.INFORMATION_MESSAGE); 
      } 

     if ("Exit".equals(arg)) 
      { 
       System.exit(0); 
      } 

     if ("ROLL".equals(arg)) 

       { 
        try 
        { 
         while (diceLeft>0) 
         { 
          getSides     = inputSides.getText(); 
          sidesToRoll     = Integer.parseInt(getSides); 
          if(sidesToRoll<1 || sidesToRoll>99)  throw new NumberFormatException(); 
          else 

          getDice      = inputDice.getText(); 
          diceToRoll     = Integer.parseInt(getDice); 
          if(diceToRoll<1 || diceToRoll>99)  throw new NumberFormatException(); 
          else 

          getModifier     = inputModifier.getText(); 
          modifier     = Integer.parseInt(getModifier); 
          if(modifier<-99 || modifier>99)   throw new NumberFormatException(); 
          else 

         rollResult     = roll.nextInt(sidesToRoll)+1; 
         rollResultTotal    = rollResultTotal + rollResult; 
         diceLeft--; 
         } 

        } 


        catch(NumberFormatException ex) 
        { 
         JOptionPane.showMessageDialog(null,"You must enter an integer within the given range of each field.","ROLL",JOptionPane.INFORMATION_MESSAGE); 
         diceLeft = 0; 
        } 


        { //Display the Roll Formula and Result 
        JOptionPane.showMessageDialog(null,"You entered a roll of " + (diceToRoll) + "d" + (sidesToRoll) + "+(" + (modifier) + ").\nYou rolled " + (rollResultTotal) + "!"); 
        } 
     ;} 
    ;} 
} 
+0

我不知道如何格式化上面的代碼,好看的觀衆。我道歉。 – 2009-12-14 08:29:20

+0

選擇代碼並按ctrl + k(已經爲你做過) – Bozho 2009-12-14 08:30:38

+0

對於那些關心學術道德的人,我已經在週末完成了這門課。現在,這全是關於個人知識。 – 2009-12-14 20:25:06

回答

1

您初始化該成員變量,但是你從來沒有這個字段添加到UI:

JTextField inputSides = new JTextField(" "); 

這裏你仍然包含字符串" ",這不是整數這個文本字段讀取。

getSides = inputSides.getText(); 
sidesToRoll = Integer.parseInt(getSides); 

當你建立在構造你的用戶界面,你聲明與另一同名,局部變量,指向一個新的對象:

JTextField inputSides = new JTextField("6"); 

這是出現在用戶界面中的對象。局部變量inputSides隱藏相同名稱的成員變量。


順便說一句,這是不是比較字符串的正確方法:

arg == "ROLL" 

這僅適用於因爲arg指向相同,實習對象實例。比較這些值的正確方法應該是:

"ROLL".equals(arg) 

編輯:

你缺少的訣竅是在考慮要創建和哪些參考變量指向的對象。

考慮你的代碼的這種簡化版本:創建

public class ObjectReferences { 
    private final JLabel label = new JLabel("I am FOO"); // label 1 

    public ObjectReferences() { 
    JLabel label = new JLabel("I am BAR"); // label 2 

    JButton button = new JButton("Click me"); 
    button.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent e) { 
     onclick(); 
     } 
    }); 

    // will display "I am BAR" 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(600, 400); 
    frame.setLayout(new FlowLayout()); 
    frame.add(label); // label 2 
    frame.add(button); 
    frame.setVisible(true); 
    } 

    public void onclick() { 
    // will display "I am FOO" 
    JOptionPane.showMessageDialog(null, label.getText()); // label 1 
    } 

    public static void main(String[] args) { 
    new ObjectReferences(); 
    } 
} 

兩個標籤對象,但只有一個被添加到幀。 label 1被成員變量引用,這是onclick()方法可見的那個。在構造函數中,標籤2被稱爲label的局部變量引用,該變量隱藏名爲label的成員變量。

你的意圖是寫這樣的事情,而不是:

public class ObjectReferences { 
    private final JLabel label = new JLabel("I am FOO"); 

    public ObjectReferences() { 
    JButton button = new JButton("Click me"); 
    button.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent e) { 
     onclick(); 
     } 
    }); 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(600, 400); 
    frame.setLayout(new FlowLayout()); 
    frame.add(label); 
    frame.add(button); 
    frame.setVisible(true); 
    } 

    public void onclick() { 
    JOptionPane.showMessageDialog(null, label.getText()); 
    } 

    public static void main(String[] args) { 
    new ObjectReferences(); 
    } 
} 
+0

我很欣賞迅速的迴應。我能夠使用「ROLL」.equals(arg)以及Exit和Help/About按鈕切換arg ==「ROLL」。我還清理了上面的代碼以反映這一變化,並刪除不必要的代碼。儘管如此,還是沒有弄清楚。 – 2009-12-14 12:40:53

+0

我編輯了我的答案,希望問題更清楚。 _另外,請注意,您尚未初始化您的'roll'成員,因此當您嘗試使用它時,您將收到NullPointerException。_ – McDowell 2009-12-14 16:44:45

+0

這開始有意義。我會繼續努力的。 :) – 2009-12-14 20:26:33