import java.awt.*; import java.util.Date; public class pnlCreditCardCost extends Panel { private final int intFillH = GridBagConstraints.HORIZONTAL; private final int intFillN = GridBagConstraints.NONE; private final int intAnchorC = GridBagConstraints.CENTER; private final int intAnchorE = GridBagConstraints.EAST; private final int intAnchorW = GridBagConstraints.WEST; private TextField txtBalance, txtRate, txtPayment; private Label lblCost, lblTime, lblError; private Button cmdCalc, cmdClear; private GridBagConstraints gbc(int gx, int gy, int gw, int gh, int gf, int ga) { GridBagConstraints gbcTemp = new GridBagConstraints(); gbcTemp.weightx = 100; gbcTemp.weighty = 100; gbcTemp.gridx = gx; gbcTemp.gridy = gy; gbcTemp.gridwidth = gw; gbcTemp.gridheight = gh; gbcTemp.fill = gf; gbcTemp.anchor = ga; return gbcTemp; } public pnlCreditCardCost(boolean blnStandAlone) { super (); Label l; GridBagLayout gblLocal = null; GridBagConstraints gbcLocal = null; gblLocal = new GridBagLayout(); setLayout(gblLocal); Font f; Panel p; f = new Font("TimesRoman", Font.BOLD, 15); l = new Label("Please Enter the Following:"); l.setFont(f); gbcLocal = gbc(0, 0, 2, 1, intFillH, intAnchorW); gblLocal.setConstraints(l, gbcLocal); add(l); f = new Font("TimesRoman", Font.PLAIN, 15); l = new Label("Credit Card Balance: $", Label.RIGHT); l.setFont(f); gbcLocal = gbc(0, 1, 1, 1, intFillH, intAnchorE); gblLocal.setConstraints(l, gbcLocal); add(l); txtBalance = new TextField(10); txtBalance.setFont(f); gbcLocal = gbc(1, 1, 1, 1, intFillH, intAnchorW); gblLocal.setConstraints(txtBalance, gbcLocal); add(txtBalance); l = new Label("Annual Percentage Rate: %", Label.RIGHT); l.setFont(f); gbcLocal = gbc(0, 2, 1, 1, intFillH, intAnchorE); gblLocal.setConstraints(l, gbcLocal); add(l); txtRate = new TextField(10); txtRate.setFont(f); gbcLocal = gbc(1, 2, 1, 1, intFillH, intAnchorW); gblLocal.setConstraints(txtRate, gbcLocal); add(txtRate); l = new Label("Minimum Monthly Payment: $", Label.RIGHT); gbcLocal = gbc(0, 3, 1, 1, intFillH, intAnchorW); gblLocal.setConstraints(l, gbcLocal); l.setFont(f); add(l); txtPayment = new TextField(10); txtPayment.setFont(f); gbcLocal = gbc(1, 3, 1, 1, intFillH, intAnchorW); gblLocal.setConstraints(txtPayment, gbcLocal); add(txtPayment); f = new Font("TimesRoman", Font.BOLD, 12); l = new Label("Please DO NOT use when entering numbers:", Label.CENTER); l.setFont(f); gbcLocal = gbc(0, 4, 2, 1, intFillH, intAnchorC); gblLocal.setConstraints(l, gbcLocal); add(l); l = new Label("Dollar Signs ($) - Percent Signs (%) - Commas (,)", Label.CENTER); l.setFont(f); gbcLocal = gbc(0, 5, 2, 1, intFillH, intAnchorC); gblLocal.setConstraints(l, gbcLocal); add(l); p = CommandPanel(blnStandAlone); gbcLocal = gbc(0, 6, 2, 1, intFillH, intAnchorC); gblLocal.setConstraints(p, gbcLocal); add(p); f = new Font("TimesRoman", Font.PLAIN, 15); lblCost = new Label("", Label.CENTER); lblCost.setFont(f); gbcLocal = gbc(0, 7, 2, 1, intFillH, intAnchorC); gblLocal.setConstraints(lblCost, gbcLocal); add(lblCost); lblTime = new Label("", Label.CENTER); lblTime.setFont(f); gbcLocal = gbc(0, 8, 2, 1, intFillH, intAnchorC); gblLocal.setConstraints(lblTime, gbcLocal); add(lblTime); f = new Font("TimesRoman", Font.BOLD, 12); lblError = new Label("", Label.CENTER); lblError.setFont(f); gbcLocal = gbc(0, 9, 2, 1, intFillH, intAnchorC); gblLocal.setConstraints(lblError, gbcLocal); add(lblError); } public boolean action(Event evt, Object what) { if ( evt.target instanceof Button ) { if ( evt.target == cmdCalc ) { Calculate(); validate(); return true; } else if ( evt.target == cmdClear ) { Clear(); return true; } } return super.handleEvent(evt); } private Panel CommandPanel(boolean blnStandAlone) { Panel pnlMain = new Panel(); GridBagLayout gblLocal = new GridBagLayout(); GridBagConstraints gbcLocal = null; Font f = new Font("TimesRoman", Font.PLAIN, 15); pnlMain.setLayout(gblLocal); cmdCalc = new Button("Calculate"); cmdCalc.setFont(f); gbcLocal = gbc(0, 0, 1, 1, intFillN, intAnchorC); gblLocal.setConstraints(cmdCalc, gbcLocal); pnlMain.add(cmdCalc); cmdClear = new Button("Clear"); cmdClear.setFont(f); gbcLocal = gbc(1, 0, 1, 1, intFillN, intAnchorC); gblLocal.setConstraints(cmdClear, gbcLocal); pnlMain.add(cmdClear); return pnlMain; } private void Clear() { txtBalance.setText(""); txtRate.setText(""); txtPayment.setText(""); lblCost.setText(""); lblTime.setText(""); lblError.setText(""); lblError.setBackground(Color.white); } private boolean Calculate() { String strRetVal = ""; double dblBalance = 0; double dblRate = 0; double dblPayment = 0; double dblInterest = 0; double dblCost = 0; int intMonths = 0; int intYears = 0; clearError(); strRetVal = "Credit Card Balance"; if ( (txtBalance.getText() == null) || (txtBalance.getText().length() == 0) ) { setFocus(txtBalance); setError("Please enter the " + strRetVal); return false; } if ( !verifyString(txtBalance.getText(), strRetVal) ) { setFocus(txtBalance); return false; } dblBalance = new Double(txtBalance.getText()).doubleValue(); if (dblBalance <= 0) { setFocus(txtBalance); setError("Please enter the " + strRetVal); return false; } strRetVal = "Annual Percentage Rate"; if ( (txtRate.getText() == null) || (txtRate.getText().length() == 0) ) { setFocus(txtRate); setError("Please enter the " + strRetVal); return false; } if ( !verifyString(txtRate.getText(), strRetVal) ) { setFocus(txtRate); return false; } dblRate = new Double(txtRate.getText()).doubleValue(); if (dblRate <= 0) { setFocus(txtRate); setError("Please enter the " + strRetVal); return false; } if (dblRate > 1) { dblRate /= 100; } dblRate /= 12; strRetVal = "Minimum Monthly Payment"; if ( (txtPayment.getText() == null) || (txtPayment.getText().length() == 0) ) { setFocus(txtPayment); setError("Please enter the " + strRetVal); return false; } if ( !verifyString(txtPayment.getText(), strRetVal) ) { setFocus(txtPayment); return false; } dblPayment = new Double(txtPayment.getText()).doubleValue(); if (dblPayment <= 0) { setFocus(txtPayment); setError("Please enter the " + strRetVal); return false; } dblCost = dblBalance; while ( dblBalance > 0 ) { intMonths++; if ( dblPayment > dblBalance ) dblPayment = dblBalance; dblBalance -= dblPayment; dblInterest = dblBalance * dblRate; dblBalance += dblInterest; dblCost += dblInterest; } lblCost.setText("The cost will be $" + toCurrency(dblCost)); intYears = intMonths / 12; intMonths = intMonths % 12; lblTime.setText("It will take " + intYears + " years, " + intMonths + " months to pay off"); return true; } private String toCurrency(double dblValue) { String strRetVal = ""; String string = "" + dblValue; if ( string.indexOf(".") < 0 ) string += "."; string += "000"; strRetVal = string.substring(string.indexOf("."), string.indexOf(".") + 3); string = string.substring(0, string.indexOf(".")); if ( string.length() > 3 ) { strRetVal = string.substring(string.length()-3) + strRetVal; string = string.substring(0, string.length()-3); while ( string.length() > 3 ) { strRetVal = string.substring(string.length()-3) + "," + strRetVal; string = string.substring(0, string.length()-3); } strRetVal = string + "," + strRetVal; } else { strRetVal = string + strRetVal; } return strRetVal; } private void setError(String strError) { if ( lblError.getBackground() != Color.red ) { lblError.setText(strError); lblError.setBackground(Color.red); } } private void clearError() { lblError.setText(""); lblError.setBackground(Color.white); } private boolean verifyString(String string, String label) { String strMsg1 = "Error: "; String strMsg2 = ""; String strMsg3 = " Not Permitted"; for ( int i=0; i 0 ) { setError(strMsg1 + strMsg2 + strMsg3); return false; } return true; } private void setFocus(TextField txtField) { txtField.requestFocus(); txtField.selectAll(); } }