2012-05-25 33 views
2

這是針對我正在做的作爲家庭作業一部分的Java程序。我不想爲我完成這項工作,但我被困住了。我對Java相當陌生,並且使用NetBeans IDE 7.0.1。整數驗證問題並顯示用戶輸入了無效數據

我在嘗試驗證用戶輸入時遇到了一些異常處理問題。該計劃將記錄來自用戶輸入的慈善捐贈。但是,我沒有成功驗證捐款金額文本字段輸入。如果用戶輸入的是文本而不是數字,我希望他們知道他們的輸入無效,並且我希望異常處理能夠處理錯誤,並在用戶修復輸入後繼續執行。任何幫助是極大的讚賞。

這裏是我的代碼:

package donorgui; 


import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import java.io.*; 
import java.awt.*; 

public class DonorGUI extends JFrame 
{ 

// Components 
private JPanel panel; 
private JTextArea results; 
private JButton entryButton; 
private JButton exitButton; 
private JButton clearButton; 
private JTextField donorField; 
private JTextField charityField; 
private JTextField pledgeField; 

//create variables 
String[] donorName = new String[20]; 
String[] charityName = new String[20]; 
double[] donationAmt = new double[20]; 
int i = 0; 


// Constants for the window size 
private final int WINDOW_WIDTH = 750; 
private final int WINDOW_HEIGHT = 510; 

//Constructor 
public DonorGUI(){ 

    // Set the title. 
    setTitle("Donor"); 

    // Specify what happens when the close button is clicked. 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Build the panel that contains the other components. 
    buildPanel(); 

    // Add the panel to the content pane. 
    add(panel); 

    // Size and display the window. 
    setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
    setVisible(true); 
} 

//The buildPanel method creates a panel containing other components. 
private void buildPanel(){ 

    // Create labels to display instructions. 
    JLabel message1 = new JLabel("Name of the Donor:"); 
    JLabel message2 = new JLabel("Name of the Charity:"); 
    JLabel message3 = new JLabel("Amount of the Pledge:"); 

    //instantiate the results area 
    results = new JTextArea(25,60); 

    // Create text fields to receive user input 
    donorField = new JTextField(10); 
    charityField = new JTextField(10); 
    pledgeField = new JTextField(10); 


    //create the user buttons to cause action 
    entryButton = new JButton("Enter Donation."); 
    entryButton.addActionListener(new EntryButtonListener()); 
    exitButton = new JButton("EXIT"); 
    exitButton.addActionListener(new ExitButtonListener()); 
    clearButton = new JButton ("Clear Fields"); 
    clearButton.addActionListener(new ClearButtonListener()); 


    // Create a panel. 
    panel = new JPanel(); 

    //set the LayoutManager 
    panel.setLayout(new FlowLayout()); 

    // Add the labels, text fields, and button to the panel. 
    panel.add(message1); 
    panel.add(donorField); 
    panel.add(message2); 
    panel.add(charityField); 
    panel.add(message3); 
    panel.add(pledgeField); 
    panel.add(results); 
    panel.add(entryButton); 
    panel.add(exitButton); 
    panel.add(clearButton); 

} 
private class EntryButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 

     donorName[i] = donorField.getText(); 
     charityName[i] = charityField.getText(); 
     donationAmt[i] = Double.parseDouble(pledgeField.getText()); 
     results.append(donorName[i]+" "+charityName[i]+" "+donationAmt[i]+"\n "); 
     i++; 
    } 
} 
public boolean donationAmt(String amount) { 
    int i = 0; 
    try { 
     i = Integer.parseInt (amount); 
     return true; 
    } 
    catch (NumberFormatException e) { 
     JOptionPane.showMessageDialog(null, "Invalid Input. Please enter a dollar amount"); 
     return false; 
    } 


} 
private class ClearButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed (ActionEvent e) { 
     donorField.setText(""); 
     charityField.setText(""); 
     pledgeField.setText(""); 
     } 
} 
private class ExitButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     System.exit(0); 
    } 
} 

/* Application method */ 
public static void main(String[] args){ 

    DonorGUI rpc = new DonorGUI(); 
} 

}

這是我修改後的代碼。在一些用戶輸入測試之後,當我使用100.00,40.00等...而不是全部美元數量時,例如100,40等,我得到一個例外。 有什麼想法?

package donorgui; 


import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import java.io.*; 
import java.awt.*; 

public class DonorGUI extends JFrame 
{ 
// Components 
private JPanel panel; 
private JTextArea results; 
private JButton entryButton; 
private JButton exitButton; 
private JButton clearButton; 
private JTextField donorField; 
private JTextField charityField; 
private JTextField pledgeField; 

//create variables 
String[] donorName = new String[20]; 
String[] charityName = new String[20]; 
double[] donationAmt = new double[20]; 
int i = 0; 


// Constants for the window size 
private final int WINDOW_WIDTH = 750; 
private final int WINDOW_HEIGHT = 550; 

//Constructor 
public DonorGUI(){ 

    // Set the title. 
    setTitle("Donor"); 

    // Specify what happens when the close button is clicked. 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Build the panel that contains the other components. 
    buildPanel(); 

    // Add the panel to the content pane. 
    add(panel); 

    // Size and display the window. 
    setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
    setVisible(true); 
} 

//The buildPanel method creates a panel containing other components. 
private void buildPanel(){ 

    // Create labels to display instructions. 
    JLabel message1 = new JLabel("Name of the Donor:"); 
    JLabel message2 = new JLabel("Name of the Charity:"); 
    JLabel message3 = new JLabel("Amount of the Pledge:"); 

    //instantiate the results area 
    results = new JTextArea(25,60); 


    // Create text fields to receive user input 
    donorField = new JTextField(10); 
    charityField = new JTextField(10); 
    pledgeField = new JTextField(10); 


    //create the user buttons to cause action 
    entryButton = new JButton("Enter Donation."); 
    entryButton.addActionListener(new EntryButtonListener()); 
    exitButton = new JButton("EXIT"); 
    exitButton.addActionListener(new ExitButtonListener()); 
    clearButton = new JButton ("Clear Fields"); 
    clearButton.addActionListener(new ClearButtonListener()); 


    // Create a panel. 
    panel = new JPanel(); 

    //set the LayoutManager 
    panel.setLayout(new FlowLayout()); 

    // Add the labels, text fields, and button to the panel. 
    panel.add(message1); 
    panel.add(donorField); 
    panel.add(message2); 
    panel.add(charityField); 
    panel.add(message3); 
    panel.add(pledgeField); 
    panel.add(results); 
    panel.add(entryButton); 
    panel.add(exitButton); 
    panel.add(clearButton); 

} 
private class EntryButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 

     donorName[i] = donorField.getText(); 
     charityName[i] = charityField.getText(); 
       if (donationAmt(pledgeField.getText())) { 
        donationAmt[i] = Double.parseDouble(pledgeField.getText()); 
       } 
     results.append(donorName[i]+" "+charityName[i]+" "+donationAmt[i]+"\n "); 
     i++; 
    } 
} 

public boolean donationAmt(String amount) { 
    if(amount==null || amount=="" || amount.length()<1){ //checking for empty field 
     JOptionPane.showMessageDialog(null, "Please enter a dollar amount"); 
     return false; 
    } 

    for(int i = 0; i < amount.length(); i++){ //verifying dollar amount entered as number 
      if (!Character.isDigit(amount.charAt(i))){ 
       JOptionPane.showMessageDialog(null, "Invalid input. Please enter a dollar amount"); 
       return false; 
      } 
    } 
    return true; 

} 



private class ClearButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed (ActionEvent e) { 
     donorField.setText(""); 
     charityField.setText(""); 
     pledgeField.setText(""); 
     } 
} 
private class ExitButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     System.exit(0); 
    } 
} 

/* Application method */ 
public static void main(String[] args){ 

    DonorGUI rpc = new DonorGUI(); 
} 

}

+1

您能夠使用'JSpinner'的數額?這對用戶(&你)會更容易。 –

回答

0

這樣的事情會起作用。這將進行檢查,以便金額不爲空,並僅包含基於現有方法的數字。

public boolean donationAmt(String amount) { 
     if(amount==null || amount=="" || amount.length()<1){ //check so that the amount field is not empty, pherhaps you can add a check so the amound is not 0 :) 
      JOptionPane.showMessageDialog(null, "Invalid Input. The amount cannot be empty"); 
      return false; 
     } 

     for(int i = 0; i < amount.length(); i++){ //loop thru the string and check so that each char is a digit 
       if (!Character.isDigit(amount.charAt(i))){ 
        JOptionPane.showMessageDialog(null, "The amount can contain only numbers"); 
        return false; 
       } 
return true; 

如果你想確保量不爲0,一個辦法是解析量爲int,並查得parsedAmount<0。它的驗證後的金額不爲空,這應該做的,是唯一的數字(E.I最後:)),以避免NPE的和NumberFormatException的

1
private class EntryButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 

     donorName[i] = donorField.getText(); 
     charityName[i] = charityField.getText(); 
     if(donationAmt(pledgeField.getText())){ 
      donationAmt[i] = Double.parseDouble(pledgeField.getText()); 
      results.append(donorName[i] + " " + charityName[i] + " " + donationAmt[i] + "\n "); 
      i++; 
     } 
    } 
} 
+0

非常感謝投入的人。從我所知道的看來,它正在發揮作用。但是,當我進行一些用戶輸入測試時,我遇到了一個新問題。如果我輸入的是全部美元金額,但是如果輸入10.00,100.00等等,它似乎沒有驗證。有什麼想法嗎? – Wil