1. 编程题目书写
2. 编程思路
从所显示界面分析,我选择用BorderLayout布局来实现。
页面北部用FlowLayout布局显示三个标签“本金”,“年利率”及“利息小计”。
页面中部用FlowLayout布局显示与标签相对应的六个文本框与“利息合计”标签及其文本框,其中利息小计与合计文本框设置为不可编辑。
页面南部用FlowLayout布局显示“计算”和“结束”两个按钮。
为实现其功能,需给“计算”“结束”按钮增加相应监听器。
监听器功能实现:
1. 输入值,点击“计算”,判断输入值是否有效(是否为数字,是否大于0),若无效则弹出消息对话框提示用户。
2. 输入值,点击“计算”,正常计算显示利息。
3.点击“结束”则退出程序。
3. 遇到的问题及解决
- 大体布局的设置,以为可以直接将各组件添加到BorderLayout布局中,结果出错,于是搜索后采用先将各组件添加到JPanel中,再添加到对应位置。
- 监听器用外部类实现,需要声明一个对象比如view来访问其它类成员。
- 文本框输入需要用getText()返回字符串,并用Double.parseDouble()来转化计算,计算完成后需再次用String.valueOf()转化,并用setText显示运算结果。
- 如果用户输入值无效,则需要用JOptionPane.showMessageDialog(),来弹出消息对话框提示。
- 为减少代码量,用匿名内部类单独实现了“结束”按钮的监听器,学习并熟悉了此方法。
4. 总结
熟悉了外部类实现图形界面功能的大体框架及方法,能够根据图片需求分析大体布局,学习并掌握了一些构造图形界面的细节与方法,学习到了匿名内部类实现监听器的方法,能够将程序功能实现做得较为完善,对用户更加友好方便。
5. 代码实现
5.1 InterestCalculator.java
package mypackage;
public class InterestCalculator{
public static void main(String[] args) {
WindowCalculator win = new WindowCalculator();
}
}
5.2 WindowCalculator.java
package mypackage;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class WindowCalculator extends JFrame {
public JTextField principal1, principal2, interest1, interest2, rate1, rate2, sum;
public JButton button1, button2;
PoliceListen listener;
public WindowCalculator() {
setSize(500, 300);
setLocationRelativeTo(null);
setLayout(new BorderLayout());
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT, 95, 5));
JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel panel3 = new JPanel(new FlowLayout(FlowLayout.CENTER));
button1 = new JButton("计算");
button2 = new JButton("结束");
principal1 = new JTextField(15);
principal2 = new JTextField(15);
interest1 = new JTextField(15);
interest1.setEditable(false);
interest2 = new JTextField(15);
interest2.setEditable(false);
rate1 = new JTextField(15);
rate2 = new JTextField(15);
sum = new JTextField(15);
sum.setEditable(false);
listener = new PoliceListen();
listener.setView(this);
button1.addActionListener(listener);
button2.addActionListener((ActionListener) new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
panel1.add(new JLabel("本金"));
panel1.add(new JLabel("年利率"));
panel1.add(new JLabel("利息小计"));
add(panel1, BorderLayout.NORTH);
panel2.add(principal1);
panel2.add(rate1);
panel2.add(interest1);
panel2.add(principal2);
panel2.add(rate2);
panel2.add(interest2);
panel2.add(new JLabel("利息合计"));
panel2.add(sum);
add(panel2, BorderLayout.CENTER);
panel3.add(button1);
panel3.add(button2);
add(panel3, BorderLayout.SOUTH);
}
}
5.3 PoliceListen.java
package mypackage;
import java.awt.event.*;
import javax.swing.JOptionPane;
public class PoliceListen implements ActionListener{
WindowCalculator view;
public void setView(WindowCalculator view) {
this.view = view;
}
public void actionPerformed(ActionEvent e) {
try {
double principal1 = Double.parseDouble(view.principal1.getText());
double principal2 = Double.parseDouble(view.principal2.getText());
double rate1 = Double.parseDouble(view.rate1.getText());
double rate2 = Double.parseDouble(view.rate2.getText());
if (principal1 < 0 || principal2 < 0 || rate1 < 0 || rate2 < 0) {
JOptionPane.showMessageDialog(view, "请输入有效的数值", "错误", JOptionPane.ERROR_MESSAGE);
} else {
double interest1 = principal1 * rate1;
double interest2 = principal2 * rate2;
double sum = interest1 + interest2;
view.interest1.setText(String.valueOf(interest1));
view.interest2.setText(String.valueOf(interest2));
view.sum.setText(String.valueOf(sum));
}
} catch (NumberFormatException exp) {
JOptionPane.showMessageDialog(view, "请输入有效的数值", "错误", JOptionPane.ERROR_MESSAGE);
}
}
}