2

I have written the code for AmortizationLoanSchedule in Swing but the look is not good. How to adjust the sizes of the labels , text-field & button?

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

public class AmortizationLoanSchedule extends JApplet implements ActionListener {

    private JLabel LoanAmount = new JLabel("Loan Amount");
    private JLabel NumberOfYears = new JLabel("Number Of Years");
    private JLabel InterestRate = new JLabel("Interest Rate (Annual)");

    private JTextField jtfLoanAmount = new JTextField(10);
    private JTextField jtfNumberOfYears = new JTextField(10);
    private JTextField jtfInterestRate = new JTextField(10);

    // Calculate button is also needed
    private JButton jbtCalculate = new JButton("Amortize Loan");

    // ...and a text area where the results will be displayed
    private JTextArea jtaResults = new JTextArea();

    public void init() {
        try {
            // Panel p1 will hold the input
            JPanel p1 = new JPanel();
            p1.setLayout(new GridLayout(3, 3));
            p1.add(LoanAmount);
            p1.add(jtfLoanAmount);
            p1.add(NumberOfYears);
            p1.add(jtfNumberOfYears);
            p1.add(InterestRate);
            p1.add(jtfInterestRate);

            // Panel p2 will hold panel p1 and the calculate button
            JPanel p2 = new JPanel();
            p2.setLayout(new BorderLayout());
            p2
                    .setBorder(new TitledBorder(
                            "Enter loan amount, Number of years and annual interest rate"));
            p2.add(p1, BorderLayout.BEFORE_FIRST_LINE);
            p2.add(jbtCalculate, BorderLayout.AFTER_LAST_LINE);

            // Action listener for the button
            jbtCalculate.addActionListener(this);

            // Make the text area scrollable and uneditable
            JScrollPane scrollPane = new JScrollPane(jtaResults);
            jtaResults.setRows(12);
            jtaResults.setEditable(false);

            // Place the two panels to the applet
            getContentPane().add(p2, BorderLayout.NORTH);
            getContentPane().add(scrollPane, BorderLayout.SOUTH);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jbtCalculate)
            calculateLoan();
        else
            System.out.println("you will never see this text!");

    }

    public void calculateLoan() {
        if ((jtfNumberOfYears.getText().equals(""))
                || (jtfLoanAmount.getText().equals(""))
                || (jtfInterestRate.getText().equals(""))) {
            JOptionPane.showMessageDialog(null, "All fields are mandatory",
                    null, 1);
        } else {
            int numberOfYears = Integer.parseInt(jtfNumberOfYears.getText());
            double loanAmount = Double.parseDouble(jtfLoanAmount.getText());
            double annualInterestRate = (Double.parseDouble(jtfInterestRate
                    .getText())) / 100;

            double monthlyInterestRate = annualInterestRate / 12;
            double numberOfMonths = numberOfYears * 12;
            double monthlyPayment = loanAmount
                    * (monthlyInterestRate / (1 - Math.pow(
                            1 + monthlyInterestRate, -numberOfMonths)));
            double totalPayment = monthlyPayment * numberOfMonths;
            double balance = loanAmount;
            double interest;
            double principal;

            jtaResults.append("Payment#\t" + "Interest\t" + "Principal\t"
                    + "Balance\n\n");

            for (int i = 0; i < numberOfYears * 12; i++) {
                interest = (int) (monthlyInterestRate * balance * 100) / 100.0;
                principal = (int) ((monthlyPayment - interest) * 100) / 100.0;
                balance = (int) ((balance - principal) * 100) / 100.0;

                jtaResults.append(i + 1 + "\t" + interest + "\t" + principal
                        + "\t" + balance + "\n");
            }

            jtaResults.append("\n\nMonthly Payment: $"
                    + (int) (monthlyPayment * 100) / 100.0 + "\n");
            jtaResults.append("Total Payment: $" + (int) (totalPayment * 100)
                    / 100.0 + "\n\n");
        }
    }
}

AmortizationLoanSchedule

Update

This is what is required.

enter image description here

Community
  • 1
  • 1
developer
  • 9,116
  • 29
  • 91
  • 150
  • 1
    Can you draw ASCII art or add a drawing as to how you would like it to look? – Andrew Thompson Apr 08 '12 at 13:03
  • 1
    @thompson :i have uploaded the sample layout – developer Apr 08 '12 at 13:12
  • i missied one label, which is top most , please consider that also – developer Apr 08 '12 at 13:13
  • I would use a BoxLayout for the overall layout of the GUI, then use GridBagLayout for the top JPanel that holds the JLabels and JTextFields, FlowLayout for the middle JPanel that holds the JButton, and BorderLayout for the JTextArea held by a JScrollPane in the button JPanel. Either that or simply add the JScrollPane to the bottom of the overall GUI JPanel, the one using BoxLayout. – Hovercraft Full Of Eels Apr 08 '12 at 13:16

3 Answers3

8

AmortizationLayout

import java.awt.*;
import javax.swing.*;

import javax.swing.border.TitledBorder;

class AmortizationLayout {

    AmortizationLayout() {
        JPanel gui = new JPanel(new BorderLayout(2,2));

        JPanel labelFields = new JPanel(new BorderLayout(2,2));
        labelFields.setBorder(new TitledBorder("BorderLayout"));

        JPanel labels = new JPanel(new GridLayout(0,1,1,1));
        labels.setBorder(new TitledBorder("GridLayout"));
        JPanel fields = new JPanel(new GridLayout(0,1,1,1));
        fields.setBorder(new TitledBorder("GridLayout"));

        for (int ii=1; ii<4; ii++) {
            labels.add(new JLabel("Label " + ii));
            // if these were of different size, it would be necessary to
            // constrain them using another panel
            fields.add(new JTextField(10));
        }

        labelFields.add(labels, BorderLayout.CENTER);
        labelFields.add(fields, BorderLayout.EAST);

        JPanel guiCenter = new JPanel(new BorderLayout(2,2));
        guiCenter.setBorder(new TitledBorder("BorderLayout"));
        JPanel buttonConstrain = new JPanel(new FlowLayout(FlowLayout.CENTER));
        buttonConstrain.setBorder(new TitledBorder("FlowLayout"));
        buttonConstrain.add( new JButton("Click Me") );
        guiCenter.add( buttonConstrain, BorderLayout.NORTH );

        guiCenter.add(new JScrollPane(new JTextArea(5,30)));

        gui.add(labelFields, BorderLayout.NORTH);
        gui.add(guiCenter, BorderLayout.CENTER);

        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) throws Exception {
        //Create the GUI on the event dispatching thread
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new AmortizationLayout();
            }
        });
    }
}
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
  • 1
    +1 for a wonderful Layout thingy you had shown :-) , -1 for using NORTH, EAST, WEST, SOUTH with BorderLayout :( – nIcE cOw Apr 08 '12 at 13:41
  • @nIcEcOw and what's wrong with NORTH, EAST, WEST, SOUTH? +1 for Andrew Thompson as usual :) – Eng.Fouad Apr 08 '12 at 13:46
  • @Eng.Fouad I suspect it was for lack of using `PAGE_START`/`PAGE_END` etc. – Andrew Thompson Apr 08 '12 at 13:47
  • 1
    @nIcEcOw In my defense, it was *actually* using NORTH, EAST & CENTER. :D – Andrew Thompson Apr 08 '12 at 13:48
  • LOL, don't take me in the wrong sense, but [Java Docs](http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html) says "Before JDK release 1.4, the preferred names for the various areas were different, ranging from points of the compass (for example, BorderLayout.NORTH for the top area) to wordier versions of the constants we use in our examples. The constants our examples use are preferred because they are standard and enable programs to adjust to languages that have different orientations." – nIcE cOw Apr 08 '12 at 14:14
  • @nIcEcOw Yes, I should drag myself (kicking & screaming) into using the constants available mid last decade. ..Real soon now. ;) – Andrew Thompson Apr 08 '12 at 14:17
  • I wrote wrong I guess, I wanted to write +2, but wrote +1, so depending on that did my calculations in the wrong sense :( – nIcE cOw Apr 08 '12 at 14:18
  • @AndrewThompson please can you check below link please http://stackoverflow.com/q/11425293/668970 – developer Jul 11 '12 at 14:57
  • @AndrewThompson did u check the post i posted, can you help me on that please – developer Jul 11 '12 at 17:19
3

The sizes are being determined by the LayoutManager you're choosing. You can either choose a LayoutManager that will place and size things the way you want, or put blank elements (JPanels should work) in places where you want space to appear.

You can also use methods on the components such as setMaximumSize(Dimension) to more directly control the size of various components.

jefflunt
  • 33,527
  • 7
  • 88
  • 126
2

1) whats wrong with

or

2) to avoiding input of non_Digits chars use DocumentFilter for plain JTextField

Community
  • 1
  • 1
mKorbel
  • 109,525
  • 20
  • 134
  • 319