📄 calculator.java
字号:
package day1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JTextField;
//public class Calculator implements ActionListener,WindowListener{
public class Calculator extends Frame implements ActionListener{//implements WindowListener{
private String[] names={"7","8","9","/","sqrt",
"4","5","6","*","%",
"1","2","3","-","1/x",
"0","+/-",".","+","="};
private String[] commands={"Backspace","CE","C"};
private String[] memorys={"MC","MR","MS","M+"};
private Button[] buttons1=new Button[names.length];
private Button[] buttons2=new Button[commands.length];
private Button[] buttons3=new Button[memorys.length];
private JTextField tf;
private TextField distf;
private double result=0;
private double num1=0;
private boolean state0;//true表示输入操作数1
private boolean state1;//true表示输入操作数1
private boolean state2;//true表示输入运算符
private boolean state3;//true表示输入操作数2
private String op;
//定义构造函数以及构件布局
public Calculator(){
super("计算器");
setup();
// setLayout(new BorderLayout(0,20));
// setBackground(Color.GRAY);
pack();
setVisible(true);
addWindowListener(new WindowCloser());//
}
private void setup(){
Panel p1=new Panel(new BorderLayout(8,0));//大面板,在Frame中间
Panel p2=new Panel(new BorderLayout(0,6));
Panel p21=new Panel(new BorderLayout());
Panel p22=new Panel(new GridLayout(4,1,8,4));//mc、mr面板
Panel p3=new Panel(new BorderLayout(0,6));//p4&p5
Panel p4=new Panel(new GridLayout(1,3,4,6));//commands
Panel p5=new Panel(new GridLayout(4,5,4,4));//names
//菜单
Menu m1=new Menu("编辑(E)");
MenuItem m11=new MenuItem("复制 Ctrl+c");
MenuItem m12=new MenuItem("粘贴 Ctrl+v");
m1.add(m11);
m1.add(m12);
Menu m2=new Menu("查看(V)");
MenuItem m21=new MenuItem("标准型(T)");
MenuItem m22=new MenuItem("科学型(S)");
MenuItem m23=new MenuItem("科学分组(I)");
m2.add(m21);
m2.add(m22);
m2.add(m23);
Menu m3=new Menu("帮助(H)");
MenuItem m31=new MenuItem("帮助主题(H)");
MenuItem m32=new MenuItem("关于计算器(A)");
m3.add(m31);
m3.add(m32);
MenuBar ma=new MenuBar();
ma.add(m1);
ma.add(m2);
ma.add(m3);
setMenuBar(ma);
//文本域
tf=new JTextField("0");
tf.setHorizontalAlignment(JTextField.RIGHT);
distf=new TextField();
distf.setEditable(false);
//添加组件
for(int i=0;i<names.length;i++){
buttons1[i]=new Button(names[i]);
buttons1[i].setForeground(Color.blue);
p5.add(buttons1[i]);
buttons1[i].addActionListener(this);
}
buttons1[3].setForeground(Color.red);
buttons1[8].setForeground(Color.red);
buttons1[13].setForeground(Color.red);
buttons1[18].setForeground(Color.red);
buttons1[19].setForeground(Color.red);
for(int i=0;i<commands.length;i++){
buttons2[i]=new Button(commands[i]);
p4.add(buttons2[i]);
buttons2[i].setForeground(Color.red);
buttons2[i].addActionListener(this);
}
for(int i=0;i<memorys.length;i++){
buttons3[i]=new Button(memorys[i]);
p22.add(buttons3[i]);
buttons3[i].setForeground(Color.red);
buttons3[i].addActionListener(this);
}
p3.add(p4,BorderLayout.NORTH);
p3.add(p5,BorderLayout.CENTER);
p21.add(distf,BorderLayout.CENTER);
p2.add(p21,BorderLayout.NORTH);
p2.add(p22,BorderLayout.CENTER);
p1.add(p2,BorderLayout.WEST);
p1.add(p3,BorderLayout.CENTER);
add(tf,BorderLayout.NORTH);
add(p1,BorderLayout.CENTER);
}
//窗口事件处理
public class WindowCloser extends WindowAdapter {
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
public void actionPerformed(ActionEvent e){
String label=e.getActionCommand();
String str=tf.getText();
state0=true;
state1=false;
state2=false;
if(label=="C"){
result=0;
tf.setText("0");
state0=true;
// state2=true;
}
else if(label=="CE"){
tf.setText("0");
state0=true;
}
else if(label=="Backspace"){
if(!state2){
if(str.length()>1)
tf.setText(str.substring(0, str.length()-1));
else{tf.setText("0");
state0=true;
}
}
}
else if("0123456789".indexOf(label)>0){
if(state0){
tf.setText(label);
state0=false;
state1=true;
state2=true;
}
else if(state1){
tf.setText("3");
state2=true;
}
num1=Double.parseDouble(tf.getText());
}
// else if("0123456789".indexOf(label)>0){
// handNumber(label);
// }
else if(label=="sqrt"){
double doubleStr=Double.parseDouble(str);
doubleStr=Math.sqrt(doubleStr);
tf.setText(Double.toString(doubleStr));
if(state1) state2=true;
if(state2) state1=true;
}
else if(label=="%"){
}
else if(label=="1/x"){
if(str=="0")
tf.setText("除数不能为零.");
else{
double doubleStr=Double.parseDouble(str);
doubleStr=1/doubleStr;
tf.setText(Double.toString(doubleStr));
}
state1=true;
state2=true;
}
else if(label=="+/-"){
double doubleStr=Double.parseDouble(str);
doubleStr*=-1;
tf.setText(Double.toString(doubleStr));
}
else if(label=="."){
boolean isDot=true;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='.'){
isDot=false;
break;
}
}
if(isDot==true)
tf.setText(str+".");
state2=true;
}
else if(label=="MC")
handleMC();
else if(label=="MR")
handleMC();
else if(label=="MS")
handleMC();
else if(label=="M+")
handleM();
else if("+-*/".indexOf(label)>0)
{
handleOp(label);
}
}
/* private void handNumber(String s){
if(state0){
tf.setText(s);
}
else
tf.setText(tf.getText()+s);
state0=false;
state1=true;
//state2=true;
//num1=Double.parseDouble(tf.getText());
}
*/
private void handleOp(String s){
if(state0)
op=s;
else{
double num1=Double.parseDouble(tf.getText());
if(op=="+"){
result+=num1;
tf.setText(Double.toString(result));
state2=false;
state1=false;
state0=true;
}
if(op=="-"){
result-=num1;
tf.setText(Double.toString(result));
state2=false;
state1=false;
state0=true;
}
if(op=="*"){
result*=num1;
tf.setText(Double.toString(result));
}
if(op=="/"){
if(num1==0)
tf.setText("除数不能为零。");
else{
result/=num1;
tf.setText(Double.toString(result));
}
}
if(op=="="){
result=num1;
tf.setText(Double.toString(result));
}
op=s;
state0=true;
state1=false;
state2=false;
}
}
private void handleMC(){
}
private void handleMR(){
}
private void handleMS(){
}
private void handleM(){
}
public static void main(String args[]) throws Exception{
Calculator cal=new Calculator();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -