2013-07-23 3 views
1

Итак, я создаю программу, которая имеет стандартный баланс банковского счета в 500. Программа запрашивает у пользователя, хотят ли они снимать или вкладывать деньги, а затем подсчитывать, сколько они выписали или депонировали и обновили текущий баланс. Почему это не работает и как я могу это исправить?Как вводить, вычислять и обновлять JLabel?

public class MyFrame extends JFrame { 

    private JPanel panel; 
    private JLabel wordsLabel; 
    private JLabel balanceLabel; 
    private JLabel choiceLabel; 
    private JTextField transactionAmount; 
    private JButton depositButton; 
    private JButton withdrawButton; 
    private double balance; 

    public MyFrame() { 
     final int FIELD_WIDTH = 10; 
     balance = 500; 
     panel = new JPanel(); 
     wordsLabel = new JLabel(); 
     balanceLabel = new JLabel(); 
     choiceLabel = new JLabel(); 
     transactionAmount = new JTextField(FIELD_WIDTH); 
     JPanel buttonPanel = new JPanel(); 
     ButtonGroup myGroup = new ButtonGroup(); 
     //panel.setLayout(new BorderLayout()); 
     depositButton = new JButton("Deposit"); 
     withdrawButton = new JButton("Withdraw"); 
     transactionAmount.setText("0"); 
     wordsLabel.setText("Welcome to Wes Banco! Your current balance is: "); 
     balanceLabel.setText("500"); 
     choiceLabel.setText("How much would you like to deposit/withdraw?"); 
     panel.add(wordsLabel); 
     panel.add(balanceLabel); 
     panel.add(choiceLabel); 
     panel.add(transactionAmount); 
     myGroup.add(depositButton); 
     myGroup.add(withdrawButton); 
     buttonPanel.add(depositButton); 
     buttonPanel.add(withdrawButton); 
     panel.add(depositButton); 

     ButtonListener myListener = new ButtonListener(); 
     depositButton.addActionListener(myListener); 
     withdrawButton.addActionListener(myListener); 

     panel.add(buttonPanel); 
     this.add(panel); 
    } 

    class ButtonListener implements ActionListener { 

     public void actionPerformed(ActionEvent event) { 
      double amount = Double.parseDouble(transactionAmount.getText()); 
      if (amount == 0) { 
       JOptionPane.showMessageDialog(null, "Enter an amount"); 
      } 
      if (depositButton.isSelected()) { 
       balanceLabel.setText("" + 500 + amount); 
       JOptionPane.showMessageDialog(null, 
        "You have deposited: " + amount); 
      } 
      if (withdrawButton.isSelected()) { 
      } 
     } 
    } 
} 
+0

Кроме того, рассмотрите возможность использования [BigDecimal] (http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html) для манипуляций, связанных с валютой, вместо использования 'double'. –

ответ

2

Вы не используете права «если» в вашем методе actionPerformed. Вы должны использовать:

if (event.getSource() == depositButton) { 
    //recalculate 
} 

вместо:

if (depositButton.isSelected()) { 
     //recalculate 
} 

IsSelected() не правильный метод, чтобы знать, если JButton была нажата. Вы должны сравнить источник события click с кнопкой.

2

Есть несколько вещей, которые идут не так.

  1. Вы используете неправильный способ, чтобы определить, какая кнопка была нажата (как указано в файле mael).
  2. Вы не обновляете переменную balance (так что количество вкладов/выходов не будет иметь эффекта).
  3. Вы вычисляете новый баланс со строками. "" + 500 + amount использует конкатенацию строк, а не дополнение.

Вам нужно что-то вроде:

public void actionPerformed(ActionEvent event) { 
    double amount = Double.parseDouble(transactionAmount.getText()); 
    if (amount == 0) { 
     JOptionPane.showMessageDialog(null, "Enter an amount"); 
    } else { 
     if (event.getSource() == depositButton) { 
      JOptionPane.showMessageDialog(null, 
       "You have deposited: " + amount); 
      balance += amount; 
     } else if (event.getSource() == withdrawButton) { 
      if (balance < amount) { 
       JOptionPane.showMessageDialog(null, 
        "You cannot withdraw more than your balance."); 
      } else { 
       JOptionPane.showMessageDialog(null, 
        "You have withdrawn: " + amount); 
       balance -= amount; 
      } 
     } 
     balanceLabel.setText(String.valueOf(balance)); 
    }   
} 

вероятно Вы также хотите форматировать количество правильно, посмотрите here.

Многие пользователи здесь также утверждают, что для финансовых расчетов следует использовать BigDecimal, а не double. Но так как это простое приложение, double будет хорошо.

+0

Я только что увидел информацию, которую вы предоставили в отношении использования BigDecimal. Уже проголосовали за это :-) –

+0

Работает отлично! Благодаря тонну! –

+0

Это не позволит мне добавить оператор if, если баланс равен <0. Я собирался сделать это, если бы баланс когда-либо опустился ниже 0, тогда появится сообщение о том, что недостаточно денег для эту транзакцию и заставить их повторно войти. –

Смежные вопросы