0

In the actionPerformed method in the AccountApplet class, I am trying to get setBalance to update the balance when called, I am not sure why but the way i called it for deposit does not update the balance. here is what the correct output for it should look like. output note when i run mine, the 1000 stays 1000 rather than the balance + deposit entered

I also receive the following errors

AccountApplet2.java:155: error: non-static method getId() cannot be referenced from a static context
    aitf.setText("" + Account.getId());
                             ^
AccountApplet2.java:156: error: non-static method getBalance() cannot be referenced from a static context
    abtf.setText("" + fmt.format(Account.getBalance()));

here is my Account Applet class

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.text.NumberFormat;


public class AccountApplet2 extends JApplet implements ActionListener
{    

  //  For West
  public JLabel  ai       = new JLabel("Account ID ");
  public JTextField  aitf = new JTextField();
  public JLabel  ab       = new JLabel("Account Balance ");
  public JTextField  abtf = new JTextField();

  //  For East
  public JButton     dp   = new JButton ("Deposit");
  public JTextField  dptf = new JTextField();
  public JButton       wt = new JButton ("Withdraw");
  public JTextField  wttf = new JTextField();

  // For South
  public JLabel  status   = new JLabel("");

  Account account = new Account(1234,1000);  // ******** here *******  

  public void init()
  {
    this.setSize(400, 90);

    //----------------------
    //  Set up the Structure
    //----------------------

    Container      c = getContentPane();
    JPanel         b = new JPanel(new BorderLayout());
    JPanel      west = new JPanel(new GridLayout(2,2));
    JPanel      east = new JPanel(new BorderLayout());
    JPanel depo_with = new JPanel(new GridLayout(2,2));

    // Add BorderLayout to the container
    c.add(b);

    // Add everything to West
    b.add(west, BorderLayout.WEST);
    west.setBorder(new TitledBorder("Display Account Information"));
    west.add(ai);
    west.add(aitf);
    aitf.setEditable(false);
    west.add(ab);
    west.add(abtf);
    abtf.setEditable(false);

    // Add everything to EAST
    b.add(east, BorderLayout.EAST); 
    east.setBorder(new TitledBorder("Deposit or Withdrawl Funds"));    
    east.add(depo_with, BorderLayout.EAST);    
    depo_with.add(dptf);
    depo_with.add(dp);
    depo_with.add(wttf);
    depo_with.add(wt);   
    dp.addActionListener(this);
    wt.addActionListener(this);

    // Add everything to SOUTH
    b.add(status, BorderLayout.SOUTH);



    refreshFields();

  }  // End intit

//-------------------------------------------------------------------------------------------------------------------------------------------------------
  public void actionPerformed(ActionEvent e)
  {


    if (e.getSource() == dp)  //  Executes if deposit was clicked
    {
      try 
      {   
        getAmount(dptf);
        account.deposit(Double.parseDouble(dptf.getText()));
        account.setBalance(Double.parseDouble(dptf.getText())); // doesnt update the balance 
        status.setText("Deposit processed");

        refreshFields();
      } 


      catch (NegativeAmountException nae) 
      {  
       status.setText(nae.getMessage() + " not allowed for deposit");
      }
      catch (EmptyFieldException efe) 
      {  
       status.setText(efe.getMessage() + " not allowed for deposit");
      }
      catch (Exception ex) 
      { 
       status.setText(ex.getMessage() + " not allowed for deposit");
      }    

    }    


    if (e.getSource() == wt)  //  Executes if withdraw was clicked
    {
      try 
      {
        getAmount(wttf);
        status.setText("Withdraw processed");

        refreshFields();
      } 
     // catch (InsufficientFundsException ife) 
     // {  
     //  status.setText(ife.getMessage() + " Insufficient funds");
     // }
      catch (NegativeAmountException nae) 
      {  
       status.setText(nae.getMessage() + " not allowed for withdraw");
      }
      catch (EmptyFieldException efe) 
      {  
       status.setText(efe.getMessage() + " not allowed for withdraw");
      }
      catch (Exception ex) 
      {
        // Something went wrong - handle your error here
        status.setText(" for withdraw");
      }

      refreshFields();
    }
  }


  public void refreshFields()
  {
    NumberFormat fmt = NumberFormat.getCurrencyInstance();
    aitf.setText("" + Account.getId());
    abtf.setText("" + fmt.format(Account.getBalance()));

    // diplays accound id and balance in left text fields
    //should be called when the applet is first displayed and after each valid transaction
  }

 public double getAmount(JTextField tf) throws EmptyFieldException,
                                               NumberFormatException,
                                               NegativeAmountException
 {
   double depo;

   try 
   {
     depo = Double.parseDouble(dptf.getText());  // read in one textfield and convert to a number
   } 
     catch (NumberFormatException nfe)  // catch NumberFormatException
   {
     throw nfe;  // catch throws NumberFormatException
   }



    return depo;
  }  //  End    



} // End Class

Account class where the methods and etc are

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



public class Account
{
  int id         = 1234;
  double balance = 1000.00;

  Account (int id, double balance)
  {
    id      = 1234;
    this.balance = balance;
  }

  public int getId()
  {

    return id; 
  }

  public double getBalance()
  {
    return balance;   
  }

  public void setBalance(double balance) throws NegativeAmountException
  {
    if ( balance < 0)
      throw new NegativeAmountException();
    this.balance = balance;
  }

  public void deposit(double amount) throws NegativeAmountException
  {
    if (amount < 0)
    throw new NegativeAmountException();
    balance += amount;
  }

  public void withdraw(double amount) throws NegativeAmountException,
                                             InsufficientFundsException
  {

    if (amount <= balance )
    {
      throw new NegativeAmountException();
    }

    if (amount <= balance )
    {
      throw new InsufficientFundsException();
    }

    balance -= amount;


  }




}

1 Answers1

1

You're creating new Account objects throughout your program, and finding out that changing one Account object will have no effect on the others. The key to solving this is to create one Account object in the GUI, to make changes to it and it alone, and to display these changes in the GUI. To see what I mean, search your code for new Account. There should only be one of these in your program, and it should not be within any action listener code.

In fact, I'd create my Account object in the variable declaration part of the program and be done with it:

public class AccountApplet2 extends JApplet implements ActionListener {    
    //  For West
    public JLabel  ai       = new JLabel("Account ID ");
    public JTextField  aitf = new JTextField();
    public JLabel  ab       = new JLabel("Account Balance ");
    public JTextField  abtf = new JTextField();

    //  For East
    public JButton     dp   = new JButton ("Deposit");
    public JTextField  dptf = new JTextField();
    public JButton       wt = new JButton ("Withdraw");
    public JTextField  wttf = new JTextField();

    // For South
    public JLabel  status   = new JLabel("");  

    Account account = new Account(1234,1000);  // ******** here *******

Also note that this is broken:

Account (int id, double balance) {
    id = 1234;
    this.balance = balance;
}    

You're completely ignoring the id that is passed into the parameter. Better would be

Account (int id, double balance) {
    this.id = id;
    this.balance = balance;
}    

Regarding your new "non-static method cannot be referenced from a static context" error, don't try to call instance (non-static) methods on the Account class. Instead call them on the account variable (after you've created it as per my recommendations above).

e.g., change

int id = Account.getId();

to

int id = account.getId();

but again only after you've declared and initialized an account variable of Account type as per my recommendations above.

Please read the Java and OOP Tutorial for more on this critical concept of class and variable (or instance)>

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • I removed both instances and just have Account account=new Account(1234,1000); //where 1234 is your account id and 1000 is your initail balance right below the class definition but this in turn gives me the errors AccountApplet2.java:154: error: non-static method getId() cannot be referenced from a static context aitf.setText("" + Account.getId()); ^ AccountApplet2.java:155: error: non-static method getBalance() cannot be referenced from a static context abtf.setText("" + fmt.format(Account.getBalance())); in the refreshFields method – slow.learner May 03 '16 at 15:57
  • @slow.learner: see edit to answer. As for your next problem, edit your question and show the code in a formatted way so I can read it. But also look critically at the error message as it's telling you exactly what is wrong -- you're calling `getBalance()` on the Account class not on the instance. – Hovercraft Full Of Eels May 03 '16 at 16:01
  • @slow.learner: same for `getId()`. You're calling it on the Account ***class*** -- `Acount.getId();` when you should be calling it on an instance of the class. This difference between a class and an instance of the class is a basic Java core concept, one that you had better understand well if you wish to progress. Please have a look at your book or tutorial on this topic and study it well. – Hovercraft Full Of Eels May 03 '16 at 16:07
  • how do i call it on an instance of the class? i have only ever been taught on how to call the class? - and my course does not have a text so i do must of my learning on this website – slow.learner May 03 '16 at 16:11
  • @slow.learner: what? you're already calling it on instances of the class in your code in your question above. Note the difference between the Account class and the account reference variable -- the variable refers to the instance. You'd better then go through the intro to [classes and OOP portion of the Java tutorial](http://docs.oracle.com/javase/tutorial/java/concepts/index.html) (see link) because again this is key knowledge that you absolutely need. – Hovercraft Full Of Eels May 03 '16 at 16:13
  • @slow.learner: please see this question with a similar problem:[“Non-static method cannot be referenced from a static context” error](http://stackoverflow.com/questions/4922145/non-static-method-cannot-be-referenced-from-a-static-context-error). – Hovercraft Full Of Eels May 03 '16 at 16:17