简体   繁体   English

通过从另一个类调用方法来更新信息

[英]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. 在AccountApplet类的actionPerformed方法中,我试图让setBalance在被调用时更新余额,我不确定为什么,但是我调用它的方式来存入余额不会更新余额。 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 请注意,当我运行我的时,1000保持1000,而不是输入的余额+存款

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. 您正在整个程序中创建新的Account对象,并且发现更改一个Account对象不会影响其他Account对象。 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. 解决此问题的关键是在GUI中创建一个 Account对象,对其进行单独更改,并在GUI中显示这些更改。 To see what I mean, search your code for new Account . 要了解我的意思,请在您的代码中搜索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: 实际上,我将在程序的变量声明部分中创建我的Account对象,并完成该操作:

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. 您完全忽略了传递给参数的ID。 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. 关于新的“无法从静态上下文引用非静态方法”错误,请不要尝试在Account类上调用实例(非静态)方法。 Instead call them on the account variable (after you've created it as per my recommendations above). 而是在account变量上调用它们(按照我上面的建议创建之后)。

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)> 请阅读Java和OOP教程 ,详细了解类和变量(或实例)的关键概念。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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