- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在AccountApplet类的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()));
这是我的帐户小程序类
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
方法等所在的帐户类
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;
}
}
最佳答案
您在整个程序中创建新的帐户对象,并发现更改一个帐户对象不会对其他对象产生影响。解决此问题的关键是在 GUI 中创建一个 Account 对象,对其进行单独更改,并在 GUI 中显示这些更改。要明白我的意思,请在代码中搜索新帐户
。您的程序中应该只有其中之一,并且它不应该位于任何操作监听器代码中。
事实上,我会在程序的变量声明部分创建我的 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;
}
<小时/>
关于新的“无法从静态上下文引用非静态方法”错误,请勿尝试调用 Account 类上的实例(非静态)方法。相反,在帐户变量上调用它们(在按照我上面的建议创建它之后)。
例如,更改
int id = Account.getId();
至
int id = account.getId();
但同样只有在您按照我上面的建议声明并初始化了 Account 类型的帐户变量之后才可以。
请阅读Java and OOP Tutorial有关类和变量(或实例)这一关键概念的更多信息>
关于java - 通过调用另一个类的方法来更新信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37008673/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!