Adjust label, text box and button size
I wrote the code for AmortizationLoanSchedule
in Swing, but the look is not very good. How do I customize the sizes of labels, text box and 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");
}
}
}
Update
This is what is required.
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();
}
});
}
}
The dimensions are determined by the LayoutManager you choose . You can choose the LayoutManager, which will position and resize however you want, or blank elements (JPanels should work) in the places where you want the space to appear.
You can also use methods on components such as setMaximumSize(Dimension)
to more directly control the size of various components.
1) What happened to
- Use formatted text boxes (including the one used by the LayoutManager at the bottom of the tutorial)
or
- Use Spinners with Number Formatting
2) to avoid typing characters non_Digits
use DocumentFilter for regular JTextField