简体   繁体   中英

Updating information by calling methods from another class

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. 输出 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;


  }




}

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).

eg, 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)>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM