我在Swing中编写了AmortizationLoanSchedule
的代码,但外观并不好。如何调整标签尺寸,文字字段和尺寸按钮?
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");
}
}
}
这是必需的。
答案 0 :(得分:8)
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();
}
});
}
}
答案 1 :(得分:3)
尺寸由LayoutManager you're choosing决定。您可以选择一个LayoutManager,它将按照您想要的方式放置和调整大小,或者在您想要空间出现的位置放置空白元素(JPanels应该可以工作)。
您还可以使用setMaximumSize(Dimension)
等组件上的方法来更直接地控制各种组件的大小。
答案 2 :(得分:2)
1)
有什么不对或
2)避免输入non_Digits
字符使用DocumentFilter作为普通JTextField