Java中实现一个计算器功能。
利用Java swing技术设计一个简单的计算器,界面如图所示。
界面简述:
整个面板的由一个JTextFiled组件+16个JButton组件构成,外加一个JPanel组件存放16个按钮,其布局为4x4的网格布局(GridLayout)。
显示框与按钮面板放在了整个面板容器中,布局为BorderLayout,显示框放容器北部,整个按钮面板放容器中部。
功能实现简述:
由匿名内部类实现ActionListener接口,按钮注册进行监听,并捕获按钮事件。
由于该计算器只能计算中缀表达式,即数字与运算符交替出现的表达式,获取输入的运算表达式,并将其存与一个字符串中。
程序代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import com.sun.org.apache.xalan.internal.xsltc.runtime.Operators;
public class zuoyan extends JFrame implements ActionListener {
private final String[]KEYS={"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
private final String[]Command={"delete","C"};
private JButton[] keys=new JButton[KEYS.length];
private JButton[] coms=new JButton[Command.length];
private JTextField text=new JTextField("0");
private boolean Firstdigit=true;
private double result=0.0;
private String operator = "=";//默认操作为"="
private boolean operateValidFlag = true;//操作是否合法
public zuoyan() {
init();
this.setTitle("计算器");
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//this.setSize(width, height)
this.pack();
}
private void init() {
// TODO Auto-generated method stub
text.setHorizontalAlignment(JTextField.RIGHT);
text.setBackground(Color.white);
text.setEditable(false);
JPanel keyspanel=new JPanel();//装按键的画板
keyspanel.setLayout(new GridLayout(4,4,3,3));//布局为网格布局4行4列 水平竖直间距都为3像素
for(int i=0;i<keys.length;i++){//创建按钮
keys[i]=new JButton(KEYS[i]);
keyspanel.add(keys[i]);//在画板上添加按钮
keys[i].setForeground(Color.blue);//按键前景色蓝色
}
//运算符按键前景色为红
keys[3].setForeground(Color.red);
keys[7].setForeground(Color.red);
keys[11].setForeground(Color.red);
keys[14].setForeground(Color.black);
keys[15].setForeground(Color.red);
JPanel comspanel=new JPanel();
comspanel.setLayout(new GridLayout(1,2,3,3));
for(int i=0;i<coms.length;i++){
coms[i]=new JButton(Command[i]);
comspanel.add(coms[i]);
}
JPanel panel1=new JPanel();
panel1.setLayout(new BorderLayout(3,3));
panel1.add("North", comspanel);
panel1.add("Center", keyspanel);
JPanel top = new JPanel(); //装文本框的画板
top.setLayout(new BorderLayout()); //边界布局
top.add("Center", text);
getContentPane().setLayout(new BorderLayout(3,5));
getContentPane().add("North", top); //北 放置top画板 里面是文本框
getContentPane().add("Center", panel1); //中心 放置panel1画板 装的是数字按键和命令按键
for (int i = 0; i < KEYS.length; i++) {
keys[i].addActionListener(this);
}
for (int i = 0; i < Command.length; i++) {
coms[i].addActionListener(this);
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String label=e.getActionCommand();
if(label==Command[0]){
handleDelete();
}
else if(label==Command[1]){
handLeC();
}
else if("0123456789.".indexOf(label)>=0){
handlenumber(label);
}
else{
handleOperator(label);
}
}
private void handleOperator(String label) {
// TODO Auto-generated method stub
if(operator.equals("/")){
if(text.getText()=="0"){
text.setText("除数不能为0");
operateValidFlag=false;
handLeC();
}
else{
result/=Double.valueOf(text.getText());
}
}
else if(operator.equals("*")){
result*=Double.valueOf(text.getText());
}
else if(operator.equals("+")){
result+=Double.valueOf(text.getText());
}
else if(operator.equals("-")){
result-=Double.valueOf(text.getText());
}
else if(operator.equals("=")){
result=Double.valueOf(text.getText());
}
if(operateValidFlag){
text.setText(String.valueOf(result));
}
operator=label;
Firstdigit = true;//按完运算符后 在输入数字为第一次输入
operateValidFlag=true;
}
private void handlenumber(String label) {
// TODO Auto-generated method stub
if(Firstdigit){
if(label.equals(".")){
text.setText(text.getText()+".");
}
else{
text.setText(label);
}
}
//按的是"."并且字符串里没"."
else if(label.equals(".")&&text.getText().indexOf(".")<0){
text.setText(text.getText()+".");
}
//按得是数字
else if(!label.equals(".")){
text.setText(text.getText()+label);
}
Firstdigit=false;//输过就不是第一次输入了
}
private void handLeC() {
// TODO Auto-generated method stub
text.setText("0");
Firstdigit=true;
operator="=";
}
private void handleDelete() {
// TODO Auto-generated method stub
if(text.getText().length()>1){
text.setText(text.getText().substring(0, text.getText().length()-1));
}
else if(text.getText().length()==1){
text.setText("0");
}
}
public static void main(String args[]) {
zuoyan calculator1 = new zuoyan();
calculator1.setSize(280,300);
calculator1.setResizable(false);
// zuoyan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}