利用Java的GUI制作简单的计算器
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JCalculator extends JFrame implements ActionListener {
private class WindowCloser extends WindowAdapter {
• public void windowClosing(WindowEvent we) {
• System.exit(0);
• }
• }
• int i;
• // final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
• private final String[] str = { "7", "8", "9", "/", "4", "5", "6", "*", "1",
• "2", "3", "-", ".", "0", "=", "+" };
• // 创建16个按钮
• JButton[] buttons = new JButton[str.length];
• //创建重置键CE
• JButton reset = new JButton("CE");
• //创建显示器,初始值为0
• JTextField display = new JTextField("0");
• public JCalculator() {
• super("计算器");
• //JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类
• JPanel panel1 = new JPanel();
• //在容器中设置布局为GridLayout,并创建一个4*4的区域
• panel1.setLayout(new GridLayout(4,4));
• //将字符串中的常量赋值给按钮
• for (i = 0; i < str.length; i++) {
• buttons[i] = new JButton(str[i]);
• panel1.add(buttons[i]);
• }
• JPanel panel2 = new JPanel();
• //在panel2的容器中设置的布局为BorderLayout
• panel2.setLayout(new BorderLayout());
• //在panel2容器中显示屏和重置按钮的位置
• panel2.add("Center", display);
• panel2.add("East", reset);
• // JPanel panel3 = new Panel();
• //getContentPane()作用是初始化一个容器,设置布局格式为BorderLayout
• getContentPane().setLayout(new BorderLayout());
• //该容器包含panel2和panel1容器,设置他们的位置
• getContentPane().add("North", panel2);
• getContentPane().add("Center", panel1);
• // 为panel1中的每个按钮添加监听器
• for (i = 0; i < str.length; i++)
• buttons[i].addActionListener(this);
• // 为显示屏和CE重置按钮添加监听器
• reset.addActionListener(this);
• display.addActionListener(this);
• // The "close" button "X".
• addWindowListener(new WindowCloser());
• setSize(800, 800);
• //让JFrame对象显示出来:
• setVisible(true);
• // pack的作用是调整窗口的大小,使其适应组件的大小和布局。
• pack();
• }
• public void actionPerformed(ActionEvent e) {
• Object target = e.getSource();
• String label = e.getActionCommand();
• if (target == reset) {
• handleReset(); //CE重置方法
• }
• else if ("0123456789.".indexOf(label) >= 0) {
• handleNumber(label); //输入的是数字或小数点
• }
• else
• handleOperator(label); //输入的是符号,进行运算
• }
boolean isFirstDigit = true;
public void handleReset() {
display.setText("0");
isFirstDigit = true;
operator = "=";
//注意在点击CE之后一定要重置isFirstDight和operator
// System.out.println("CE之后的isDight "+isFirstDigit);
}
public void handleNumber(String label) {
if(isFirstDigit) {
//判断是不是第一下按下
if(label.equals(".")) {
display.setText("0.");
}else {
display.setText(label);
}
}else if((label.equals("."))&&(display.getText().indexOf(".")<0)){
//判断该符号是不是点,然后确定小数点在之前有没有出现过
//如果符合条件,将显示屏上之前的数字加上一个小数点
display.setText(display.getText()+".");
}else if(!label.equals(".")) {
//判断输入非首位的数字
display.setText(display.getText()+label);
}
isFirstDigit = false;
}
double number = 0.0;
String operator = "=";
public void handleOperator(String label) {
if(operator.equals("+")){
//把数字类型的字符串,转换成Double类型
number += Double.valueOf(display.getText());
}
else if(operator.equals("-")){
number -= Double.valueOf(display.getText());
}
else if(operator.equals("*")){
number *= Double.valueOf(display.getText());
}
else if(operator.equals("/")){
number /= Double.valueOf(display.getText());
}
else if(operator.equals("=")){
number = Double.valueOf(display.getText());
}
display.setText(String.valueOf(number));
operator = label;
isFirstDigit = true;
}
• public static void main(String[] args) {
• new JCalculator();
• }
}
1、利用GUI实现界面布局
首先是设计该程序的图形化界面,创建两个JPanel对象,JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,在第一个JPanel对象中以GridLayout为布局,创建一个4*4的空间,把这些空间分配给字符串中的16个常量(数字和符号),第二个JPanel对象以BorderLayout为布局,分配好显示框和CE重置按钮的空间。然后再利用getContentPane()设置新的容器,将布局设置为BorderLayout,然后分配好两个JPanel的空间。这样计算器的GUI界面就写好了。如图所示:
2、计算器计算功能的实现
(1)actionPerformed()方法,该方法中含有e.getSource()和e.getActionCommand()监听鼠标事件,判断如果点击CE按钮,执行handleReset()方法重置计算器。如果点击的数字,执行handleNumber(label)方法,如果点击的是符号,执行handleOperator(label)方法。
(2)handleNumber(label)方法,该方法可以显示鼠标点击的数字和小数点,在方法外设置全局变量isFirstDigit,判断是不是在之前有没有输入过,如果为true代表首次输入,进入该语句中,再次进行判断,如果输入的为小数点,显示器显示0.,如果输入的数字,显示器原本的0将消除,剩下输入的数字,执行完if语句后isFirstDigit 设置为 false。第二个判断是判断该符号是不是点,然后确定小数点在之前有没有出现过,如果没有出现过在显示器上加上一个小数点,第三个判断是判断是不是数字,是数字的将在显示器继续显示,并且之前的数字不会消失。
(3) handleReset()方法,该方法是重置显示器上的数字,显示器将被设置显示为0,并且isFirstDigit和operator都被重置。
(4)handleOperator(label)方法,该方法对可以进行运算,当输入完第一个运算数字后,输入运算符,设置operator的全局变量为“=”,在该方法中以“=”为判断,将第一个数字可以保存在number中,新的运算符将会保存在operator中,同时isFirstDigit设置为true,代表开始输入第二个数字,当输入完后点击运算符,进入handleOperator(label)方法,会对两数字进行上一个运算符的运算,然后显示在显示器上。注意,在进行运算时,要用Double.valueOf将字符串改成Double形式。