📄 bigatmscreen.java
字号:
//Copyright (c) 1998, Arthur Gittleman
//This example is provided WITHOUT ANY WARRANTY either expressed or implied.
/* Illustrates event-driven object-oriented
* programming previewing the concepts and
* techniques to be introduced in Chapters 2-8.
*/
import personData.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.math.BigDecimal;
public class BigAtmScreen extends Applet
implements ActionListener, ItemListener {
private Button start = new Button("Start");
private Button finish = new Button("Finish");
private TextField dataEntry = new TextField(10);
private CheckboxGroup group = new CheckboxGroup();
private Checkbox savings = new Checkbox("Savings",false,group);
private Checkbox checking = new Checkbox("Checking",false,group);
private Choice transaction = new Choice();
private String message = "Welcome to Art's Bank";
private MyCanvas canvas = new MyCanvas();
private Label textLabel = new Label("Enter Name");
private Bank bank = new Bank();
private Person[] person = Database.personData();
private Teller teller;
private Font font = new Font("Serif",Font.BOLD,18);
private FontMetrics metrics = getFontMetrics(font);
public void init() {
setLayout(new BorderLayout());
setFont(font);
Panel text = new Panel();
text.setLayout(new GridLayout(2,1));
text.add(dataEntry);
text.add(textLabel);
Panel north = new Panel();
north.add(text);
Panel checkboxes = new Panel();
checkboxes.setLayout(new GridLayout(2,1));
checkboxes.add(savings);
checkboxes.add(checking);
north.add(checkboxes);
transaction.add("Deposit");
transaction.add("Withdraw");
transaction.add("Balance");
north.add(transaction);
add(north,"North");
Panel south = new Panel();
south.add(start);
south.add(finish);
add(south,"South");
canvas.setBackground(Color.yellow);
add(canvas,"Center");
dataEntry.addActionListener(this);
savings.addItemListener(this);
checking.addItemListener(this);
transaction.addItemListener(this);
start.addActionListener(this);
finish.addActionListener(this);
clear();
}
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source==dataEntry){
String s = textLabel.getText();
if (s.equals("Enter Name")){
String name = dataEntry.getText();
if (name.equals("John Venn"))
teller.acceptCard(person[0]);
else if (name.equals("Mabel Venn"))
teller.acceptCard(person[1]);
else {
message = "Enter John Venn or Mabel Venn";
dataEntry.setText("");
canvas.repaint();
}
}
else if (s.equals("Enter PIN"))
teller.acceptPIN(dataEntry.getText());
else if (s.equals("Enter Amount"))
teller.acceptAmount(new BigDecimal(dataEntry.getText()));
}
else if (source == finish) clear();
else if (source == start){
dataEntry.setEnabled(true);
dataEntry.requestFocus();
textLabel.setEnabled(true);
start.setEnabled(false);
}
}
public void itemStateChanged(ItemEvent e) {
Object item = e.getItemSelectable();
if (item == transaction)
teller.acceptTransaction(transaction.getSelectedIndex());
else if (item == savings)
teller.acceptType(Bank.SAVINGS);
else if (item == checking)
teller.acceptType(Bank.CHECKING);
}
public void enterPIN() {
dataEntry.setText("");
textLabel.setText("Enter PIN");
message = "Enter your PIN number";
canvas.repaint();
}
public void selectTransaction() {
dataEntry.setText("");
dataEntry.setEnabled(false);
textLabel.setEnabled(false);
transaction.setEnabled(true);
message = "Select your transaction";
canvas.repaint();
}
public void selectType() {
savings.setEnabled(true);
checking.setEnabled(true);
transaction.setEnabled(false);
message = "Select your account type";
canvas.repaint();
}
public void specifyAmount() {
dataEntry.setEnabled(true);
dataEntry.requestFocus();
textLabel.setEnabled(true);
textLabel.setText("Enter Amount");
savings.setEnabled(false);
checking.setEnabled(false);
message = "Specify the amount";
canvas.repaint();
}
public void display(String s) {
dataEntry.setText("");
textLabel.setEnabled(false);
dataEntry.setEnabled(false);
checking.setEnabled(false);
savings.setEnabled(false);
message = s;
canvas.repaint();
}
public void clear() {
start.setEnabled(true);
savings.setEnabled(false);
checking.setEnabled(false);
transaction.setEnabled(false);
textLabel.setText("Enter Name");
textLabel.setEnabled(false);
dataEntry.setText("");
dataEntry.setEnabled(false);
message = "Welcome to Art's bank";
canvas.repaint();
teller = new Teller(bank,this);
}
class MyCanvas extends Canvas {
public void paint(Graphics g) {
int w = metrics.stringWidth(message);
g.drawString(message, (getSize().width-w)/2, getSize().height/3);
}
}
}
class Teller {
public static final int DEPOSIT = 0;
public static final int WITHDRAW = 1;
public static final int BALANCE = 2;
private String id;
private int transType;
private int acctType;
private Person user;
private Bank bank;
private Account account;
private BigAtmScreen screen;
public Teller(Bank b, BigAtmScreen s) {
bank = b;
screen = s;
}
public void acceptCard(Person p) {
user = p;
screen.enterPIN();
}
public void acceptPIN(String s) {
id = s;
screen.selectTransaction();
}
public void acceptTransaction(int trans) {
transType = trans;
screen.selectType();
}
public void acceptType(int type) {
acctType = type;
bank.find(id,acctType,this);
}
public void acceptAccount(Account a) {
account = a;
if (account != null)
if (transType == BALANCE){
BigDecimal balance = account.getBalance();
screen.display("The balance is $" + balance);
}
else {
if (transType == DEPOSIT || transType == WITHDRAW){
screen.specifyAmount();
}
}
else
screen.display("No such account -- session terminated");
}
public void acceptAmount(BigDecimal amount) {
switch(transType) {
case DEPOSIT :
account.deposit(amount);
screen.display("Deposit of $" + amount);
break;
case WITHDRAW:
BigDecimal taken = account.withdraw(amount);
if (taken.compareTo(new BigDecimal(0.0)) >= 0)
screen.display("Withdrawal of $" + taken);
else
screen.display("Insufficient funds");
break;
}
}
}
class Database {
public static Person[] personData() {
Name n1 = new Name("John","Venn");
Address a1 = new Address( "123 Main St.", "Tyler","WY", "45654");
Person p1 = new Person("123123123",n1,a1);
Name n2 = new Name("Mabel","Venn");
Person p2 = new Person("456456456",n2,a1);
Person[] p = {p1,p2};
return p;
}
public static Account [] accountData() {
Person[] p = personData();
Account p1Savings = new Savings(new BigDecimal(1500.00),p[0],4.0);
Account p1Checking = new Checking(p[0],2500.00,.50);
Account p2Savings = new Savings(new BigDecimal(1000.00),p[1],3.5);
Account[] a = {p1Savings,p1Checking,p2Savings};
return a;
}
}
class Bank {
public static final int SAVINGS = 1;
public static final int CHECKING = 2;
private Account [] accounts = Database.accountData();
public void find(String id, int acctType, Teller teller) {
for (int i=0; i<accounts.length; i++) {
Account acct = accounts[i];
if (acct.getId().equals(id))
switch(acctType) {
case SAVINGS:
if (acct instanceof Savings){
teller.acceptAccount(acct);
return;
}
case CHECKING:
if (acct instanceof Checking){
teller.acceptAccount(acct);
return;
}
}
}
teller.acceptAccount(null);
}
}
abstract class Account {
private BigDecimal balance;
private Person holder;
public Account(Person p) {
this(new BigDecimal(0),p);
}
public Account(BigDecimal initialAmount, Person p) {
balance = initialAmount;
holder = p;
}
public String getId() {
return holder.getId();
}
public void deposit(BigDecimal amount) {
balance = balance.add(amount);
}
public BigDecimal withdraw(BigDecimal amount) {
if (balance.compareTo(amount) >= 0){
balance = balance.subtract(amount);
return amount;
}
else
return new BigDecimal(-1.0);
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal amount) {
balance = amount;
}
}
class Checking extends Account {
private double minBalance;
private double charge;
public Checking(Person p,double minAmount, double charge) {
super(p);
minBalance = minAmount;
this.charge = charge;
}
public BigDecimal processCheck(BigDecimal amount) {
if (getBalance().compareTo(new BigDecimal(minBalance)) >= 0)
return super.withdraw(amount);
else
return super.withdraw(amount.add(new BigDecimal(charge)));
}
public BigDecimal withdraw(BigDecimal amount) {
return processCheck(amount);
}
}
class Savings extends Account {
private double interestRate;
public Savings(BigDecimal amount, Person p, double rate) {
super(amount,p);
interestRate = rate;
}
public void postInterest() {
BigDecimal balance = getBalance();
double decimalRate = interestRate/100;
BigDecimal interest = balance.multiply(new BigDecimal(decimalRate));
setBalance(balance.add(interest));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -