问题
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");
}
}
}

Update
This is what is required.

回答1:

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();
}
});
}
}
回答2:
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.
回答3:
1) whats wrong with
- Use Formatted Text Fields (inc. used LayoutManager on bottom of tutorial)
or
- Use Spinners with Number formatter
2) to avoiding input of non_Digits
chars use DocumentFilter for plain JTextField
来源:https://stackoverflow.com/questions/10062968/adjust-the-label-text-field-button-size