通过调用另一个 class 的方法来更新信息
Updating information by calling methods from another class
在 AccountApplet class 的 actionPerformed 方法中,我试图让 setBalance 在调用时更新余额,我不确定为什么,但我调用它进行存款的方式不会更新余额。这是它的正确输出应该是什么样子的。 注意当我 运行 我的时候,1000 保持 1000 而不是输入的余额 + 存款
我也收到以下错误
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()));
这是我的帐户小程序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
帐户class方法等所在
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;
}
}
您在整个程序中创建了新的 Account 对象,并发现更改一个 Account 对象不会影响其他对象。解决这个问题的关键是在 GUI 中创建 one Account 对象,对其进行更改,并单独对其进行更改,并在 GUI 中显示这些更改。要了解我的意思,请在您的代码中搜索 new Account
。您的程序中应该只有其中之一,并且它不应该在任何动作侦听器代码中。
事实上,我会在程序的变量声明部分创建我的 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 *******
另请注意,这已损坏:
Account (int id, double balance) {
id = 1234;
this.balance = balance;
}
您完全忽略了传递到参数中的 ID。更好的是
Account (int id, double balance) {
this.id = id;
this.balance = balance;
}
关于您的新 "non-static method cannot be referenced from a static context" 错误,请不要尝试调用帐户 class 上的实例(非静态)方法。而是在帐户变量上调用它们(在您按照我上面的建议创建它之后)。
例如,更改
int id = Account.getId();
至
int id = account.getId();
但只有在您按照我上面的建议声明并初始化了帐户类型的帐户变量之后。
请阅读 Java and OOP Tutorial 以了解有关 class 和变量(或实例)>
这一重要概念的更多信息
在 AccountApplet class 的 actionPerformed 方法中,我试图让 setBalance 在调用时更新余额,我不确定为什么,但我调用它进行存款的方式不会更新余额。这是它的正确输出应该是什么样子的。
我也收到以下错误
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()));
这是我的帐户小程序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
帐户class方法等所在
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;
}
}
您在整个程序中创建了新的 Account 对象,并发现更改一个 Account 对象不会影响其他对象。解决这个问题的关键是在 GUI 中创建 one Account 对象,对其进行更改,并单独对其进行更改,并在 GUI 中显示这些更改。要了解我的意思,请在您的代码中搜索 new Account
。您的程序中应该只有其中之一,并且它不应该在任何动作侦听器代码中。
事实上,我会在程序的变量声明部分创建我的 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 *******
另请注意,这已损坏:
Account (int id, double balance) {
id = 1234;
this.balance = balance;
}
您完全忽略了传递到参数中的 ID。更好的是
Account (int id, double balance) {
this.id = id;
this.balance = balance;
}
关于您的新 "non-static method cannot be referenced from a static context" 错误,请不要尝试调用帐户 class 上的实例(非静态)方法。而是在帐户变量上调用它们(在您按照我上面的建议创建它之后)。
例如,更改
int id = Account.getId();
至
int id = account.getId();
但只有在您按照我上面的建议声明并初始化了帐户类型的帐户变量之后。
请阅读 Java and OOP Tutorial 以了解有关 class 和变量(或实例)>
这一重要概念的更多信息