Java计算器
要制作一个计算器,首先需要知道它由哪些部分组成。
从结构上来说,一个简单的图形界面,需要由界面组件、组件的事件监听器(响应各类事件的逻辑)和具体的事件处理逻辑组成。
整个代码结构如下图所示:
首先我们需要将界面中要用到的 UI 组件作为 Calculator 类的成员变量在一开始声明。在阅读代码之前,可以思考一下都要用到哪些 UI 组件,以及这些代码应当写在哪个位置等等。
一个计算器界面至少包括窗口、按钮和显示文本框。如下图,这是我们希望达到的效果。
界面实现的主要工作是创建各个界面组件对象,对其进行初始化,以及控制各组件之间的层次关系和布局。
(1)面板
这个计算器有两个 JPanel。
什么是 JPanel:JPanel 是一般轻量级容器。如上图所示,你可以将其理解为一个盛放其他 UI 组件的“篮子”。 JPanel 位于 javax.swing 包中,为面板容器,可以加入到 JFrame 中 , 它自身是个容器,也可以把其他 component (组件) 加入到 JPanel 中,例如 JButton、JTextArea、JTextField 等。
在这个项目中,两个 JPanel 分别对应这个计算器按键除 “Clear” 键外其他的键,另外一个面板则是输出栏跟 “Clear” 键,参考如下图。
同样,在书写本段代码时,你应当思考它应该放在哪个部分。如果不清楚,可以回到上面的代码结构中查看。
完整代码如下:
package CalculatorDemo;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator extends JFrame implements ActionListener{
//创建窗体North
private JPanel jp_north=new JPanel();
private JTextField input_text=new JTextField();//创建输入框
private JButton c_Btn=new JButton("c");//创建清除按钮
//创建窗体Center
private JPanel jp_center=new JPanel();
public Calculator() throws HeadlessException{
this.init();
this.addNorthComponent();
this.addCenterComponent();
}
//定义窗体属性
public void init() {
this.setTitle("计算器");//窗体标题
this.setSize(300,300);//窗体大小
//设置布局(setLayout窗体自定义布局;BorderLayout边界布局管理器把容器的的布局分为五个位置:CENTER、EAST、WEST、NORTH、SOUTH)
this.setLayout(new BorderLayout());
this.setResizable(false);//窗体是否调节大小
this.setLocationRelativeTo(null);//窗体居中
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭窗体
}
//定义窗体的North控件
public void addNorthComponent() {
this.input_text.setPreferredSize(new Dimension(230,30));//输入框大小
//将控键加到North中(流式布局)
jp_north.add(input_text);
jp_north.add(c_Btn);
//实现清除功能
c_Btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
input_text.setText("");
}
});
//将jp_north加到BorderLayout.NORTH
this.add(jp_north,BorderLayout.NORTH);
}
//定义窗体的Center控件
public void addCenterComponent() {
String btn_text="123+456-789*0.=/";//按顺序加入数字,符号
this.jp_center.setLayout(new GridLayout(4, 4));//定义一个4*4的网格
//一个格子
for(int i=0;i<16;i++) {
String temp=btn_text.substring(i,i+1);//substring截取字符
JButton btn=new JButton();//按钮创建
btn.setText(temp);//将截取的字符设置到按钮上
if(temp.equals("+")||
temp.equals("-")||
temp.equals("*")||
temp.equals("/")||
temp.equals(".")||
temp.equals("=")) {
//设置符号属性
btn.setFont(new Font("粗体",Font.BOLD,16));
btn.setForeground(Color.RED);
}
btn.addActionListener(this);//事件的监听
jp_center.add(btn);//jp_center中加入按钮
}
//将jp_center加到BorderLayout.CENTER
this.add(jp_center,BorderLayout.CENTER);
}
//事件的处理
private String firstInput=null;
private String operator=null;
@Override
public void actionPerformed(ActionEvent e) {
String clickStr=e.getActionCommand();//获得事件的标签
if(".0123456789".indexOf(clickStr)!=-1) {
this.input_text.setText(input_text.getText()+clickStr);//得到连续的数
this.input_text.setHorizontalAlignment(JTextField.RIGHT);//从右向左
//JOptionPane.showMessageDialog(this, clickStr);
}else if(clickStr.equals("+")||
clickStr.equals("-")||
clickStr.equals("*")||
clickStr.equals("/")) {
operator=clickStr;//记录操作符
firstInput=this.input_text.getText();//记录第一次的数
this.input_text.setText("");//清除
}else if(clickStr.equals("=")) {
//valueOf将基本数据转为String
Double a=Double.valueOf(firstInput);
Double b=Double.valueOf(this.input_text.getText());
Double result=null;
switch(operator){
case"+":
result=a+b;
break;
case"-":
result=a-b;
break;
case"*":
result=a*b;
break;
case"/":
if(b!=0) {
result=a/b;
}
break;
}
this.input_text.setText(result.toString());
}
}
public static void main(String[] srgs) {
Calculator calculator=new Calculator();
calculator.setVisible(true);
}
}