计算器-gui
最近有人拿来一个计算器的代码来问我问题,我看了代码忍不住顺手给重写了吧,主要是将界面与业务逻辑进行了拆分,代码片段及效果如下:
import javax.swing.*;
import java.awt.*;
// 计算器界面类,DispalyRefreshable接口为可更新显示内容的接口,接口方法为refresh
public class MainView extends JFrame implements DispalyRefreshable{
// 计算器逻辑处理类,包括按钮事件的响应
private CalculatorAdapter calculatorAdapter = new CalculatorAdapter();
private JTextField show;
public static void main(String[] args) {
new MainView().setVisible(true);
}
public MainView(){
init();
}
private void init(){
calculatorAdapter.setDispalyRefreshable(this);
// 省略代码,主要是绘制计算器界面
}
@Override
public void refresh(String newValue) {
show.setText(newValue);
}
}
import lombok.Getter;
import lombok.Setter;
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
// 计算器逻辑处理类
public class CalculatorAdapter extends MouseAdapter {
@Setter
@Getter
private DispalyRefreshable dispalyRefreshable;
// 界面按钮显示
public static final String[] leftBtnTexts = "9,8,7,6,5,4,3,2,1,0,±,.".split(",");
public static final String[] rightBtnTexts = "/,sqrt,ln,*,sin,%,-,cos,CE,+,x^y,=".split(",");
// 界面按钮对应的命令
public static final String[] leftBtnCommand = "NUM_9,NUM_8,NUM_7,NUM_6,NUM_5,NUM_4,NUM_3,NUM_2,NUM_1,NUM_0,OP_sign,NUM_.".split(",");
public static final String[] rightBtnCommand = "OP_divide,OP_sqrt,OP_ln,OP_multiply,OP_sin,OP_mod,OP_sub,OP_cos,OP_ce,OP_add,OP_power,OP_cal".split(",");
private List<String> opExpList = new ArrayList<>();
public CalculatorAdapter(){
df.setRoundingMode(RoundingMode.DOWN);
}
// 按钮 响应
@Override
public void mouseClicked(MouseEvent e) {
Object source = e.getSource();
if (!(source instanceof JButton)) {
return;
}
JButton currentBtn = (JButton) source;
String actionCommand = currentBtn.getActionCommand();
if (actionCommand.startsWith("NUM_")) { //数字键
inputNumber(actionCommand.replace("NUM_", ""));
} else if (actionCommand.startsWith("OP_")) { // 操作键
String command = actionCommand.replace("OP_", "");
switch (command) {
case "ce":
resetCal();
break;
case "sign":
changeSign();
break;
default:
chagneOp(command);
break;
}
}
}
...
}
界面
源码可以在此下载