计算器 各位能帮忙解决下有些功能实现不了的问题吗

weixin_44087232 2019-01-01 04:00:19

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("unused")
public class CAl extends JFrame implements ActionListener,KeyListener{
/**
*
*/
static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); //JDK自带的类可以实现调用JS的功能,可以实现执行字符串中的运算公式的功能
private static final long serialVersionUID = 1L;
private final String[] KEYS = {
"MC", "M+", "M-", "MR",
"N!", "Sin", "Cos", "Tan",
"%", "sqrt", "X^y", "1/X",
"CE", "C", "←", "/",
"7", "8", "9", "*",
"4", "5", "6", "-",
"1", "2", "3", "+",
"+/-","0",".","=",};
private JButton keys[] = new JButton[KEYS.length];
private JTextField resultText = new JTextField("0");
// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
private boolean firstDigit = true;
// 计算的中间结果。
private double resultNum = 0.0;
// 当前运算的运算符
private String operator = "=";
// 操作是否合法
private boolean operateValidFlag = true;
/**
* 构造函数
* */
public CAl(){
super();
// 初始化计算器
init();
// 设置计算器的背景颜色
this.setBackground(Color.LIGHT_GRAY);
this.setTitle("计算器");
this.setFont(new Font("宋体",Font.BOLD,20));
// 在屏幕(800, 400)坐标处显示计算器
this.setLocation(800, 400);
// 不许修改计算器的大小
//this.setResizable(false);
// 使计算器中各组件大小合适
this.pack();
createMenuBar();// 创建菜单栏

}
private void createMenuBar() {// 创建菜单栏的方法
JMenuBar menubar = new JMenuBar();
setJMenuBar(menubar);
JMenu menu1 = new JMenu("查看");
JMenu menu2 = new JMenu("编辑");
JMenu menu3 = new JMenu("帮助");
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
final String[] MENULITEM = {"标准型(T) Alt+1",
"科学型(S) Alt+2",
"程序员(P) Alt+3",
"统计信息(A) Alt+4",
"历史记录(Y) Ctrl+H",
"数字分组(I)",
"基本(B) Ctrl+F4",
"单位转换(U) Ctrl+U",
"科日期计算(D) Ctrl+E",
"工作表(W)"};
JMenuItem menu1items[] = new JMenuItem[MENULITEM.length];

JMenuItem menu2item1 = new JMenuItem("复制 Ctrl+C");
JMenuItem menu2item2 = new JMenuItem("粘贴 Ctrl+V");
JMenuItem menu2item3 = new JMenuItem("科学分组");
JMenuItem menu3item1 = new JMenuItem("帮助主题");
JMenuItem menu3item2 = new JMenuItem("关于计算器");
for(int i=0; i < MENULITEM.length; i++){
menu1items[i]= new JMenuItem(MENULITEM[i]);
menu1.add( menu1items[i]);
}
menu2.add(menu2item1);
menu2.add(menu2item2);
menu2.add(menu2item3);
menu3.add(menu3item1);
menu3.add(menu3item2);
}
/**
* 初始化计算器
* */
private void init() {
// 文本框中的内容采用右对齐方式
resultText.setHorizontalAlignment(JTextField.RIGHT);
// 不允许修改结果文本框
resultText.setEditable(false);
// 设置文本框背景颜色为白色
resultText.setBackground(Color.WHITE);
// 初始化计算器上键的按钮,将键放在一个画板内
JPanel calckeysPanel = new JPanel();
// 用网格布局器,8行,4列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
calckeysPanel.setLayout(new GridLayout(8, 4, 3, 3));
for (int i= 0; i <4; i++) {
keys[i] = new JButton(KEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.white);
keys[i].setBackground(Color.black);
}
for (int i= 4; i < 16; i++) {
keys[i] = new JButton(KEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.black);
keys[i].setBackground(new Color(228,220,217));
}
for (int i = 16; i < KEYS.length; i++) {
keys[i] = new JButton(KEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.black);
keys[i].setBackground(Color.WHITE);
}
// 背景浅灰色键
keys[19].setBackground(new Color(228,220,217));
keys[23].setBackground(new Color(228,220,217));
keys[27].setBackground(new Color(228,220,217));
keys[31].setBackground(new Color(228,220,217));
// “CE C ←键字体颜色”
keys[12].setForeground(new Color(255,25,25));
keys[13].setForeground(new Color(255,25,25));
keys[14].setForeground(new Color(255,25,25));
// “=键字体及背景颜色”
keys[31].setBackground(new Color(238,76,12));
keys[31].setForeground(Color.white);

// 建立一个画板放文本框
JPanel top = new JPanel();
top.setLayout(new BorderLayout());
top.add("Center", resultText);

// 整体布局
getContentPane().setLayout(new BorderLayout(3,5));
getContentPane().add("North", top);
getContentPane().add("Center", calckeysPanel);
// 为各按钮添加事件侦听器
// 都使用同一个事件侦听器,即本对象。
for (int i = 0; i < KEYS.length; i++) {
keys[i].addActionListener(this);
for(int a=12;a<KEYS.length;a++){
keys[a].addKeyListener(this);
}
}
resultText.addKeyListener(new KeyAdapter()
{ //监听resultText

@Override
public void keyPressed(KeyEvent e) {
char label=e.getKeyChar();
String k=String.valueOf(label);
if(label==KeyEvent.VK_ENTER){ //如果按下回车键 则将结果展示
handleResult();
}else if(label==KeyEvent.VK_BACK_SPACE){
handleBackSpace();
}else if(label==KeyEvent.VK_DELETE){
handleC();
}else{ //否则处理该算式
handleEquation(k);
}

}});
}
@Override
public void keyPressed(KeyEvent e) {
char label=e.getKeyChar();
String k=String.valueOf(label);
if(label==KeyEvent.VK_ENTER){
handleResult();
}
else{
handleEquation(k);
}
}
@Override
public void keyReleased(KeyEvent e) {


}
@Override
public void keyTyped(KeyEvent e) {

}
/* public void windowActivated(WindowEvent e) {

}
public void windowClosed(WindowEvent e) {

}
public void windowClosing(WindowEvent e) {

}
public void windowDeactivated(WindowEvent e) {

}
public void windowDeiconified(WindowEvent e) {

}
public void windowIconified(WindowEvent e) {

}
public void windowOpened(WindowEvent e) {
//或者在窗体显示在事件里让JTextField获得焦点
resultText.requestFocus();
}
*/


/**
* 处理KEYS事件
* */
public void actionPerformed(ActionEvent e) {
// 获取事件源的标签
String label = e.getActionCommand();
if (label.equals("MC")) {
// 用户按了"MC"键
handleMC();
} else if (label.equals("M+")) {
// 用户按了"M+"键
handleM0();
} else if (label.equals("M+")) {
// 用户按了"M-"键
handleM1();
} else if (label.equals("MR")) {
// 用户按了"MR"键
handleMR();
} else if (label.equals("N!")) {
// 用户按了"N!"键
handleN();
} else if (label.equals("Sin")) {
// 用户按了"Sin"键
handleSin();
} else if (label.equals("Cos")) {
// 用户按了"Cos"键
handleCos();
} else if (label.equals("Tan")) {
// 用户按了"Tan"键
handleTan();
} else if (label.equals("%")) {
// 用户按了"%"键
handleQY();
} else if (label.equals("sqrt")) {
// 用户按了"sqrt"键
handleSQRT();
} else if (label.equals("X^y")) {
// 用户按了"X^y"键
handleZS();
} else if (label.equals("1/X")) {
// 用户按了"1/X"键
handleDS();
} else if (label.equals("CE")) {
// 用户按了"CE"键
handleCE();
} else if (label.equals("C")) {
// 用户按了"C"键
handleC();
} else if (label.equals("←")) {
// 用户按了"BackSpace"键
handleBackSpace();
} else if (label.equals("+/-")) {
// 用户按了"+/-"键
handlehandleOppositeNumber();
}else if (label.equals("=")) {
// 用户按了"="键
handleResult();
}else {
// 用户按了运算符(+-*/=)键
handleNumber(label);
handleOperator();
}
}

private void handleMC(){
resultNum=0.0;
}
private void handleM0(){
double a=Double.valueOf(resultText.getText());
if(!resultText.getText().equals("0")){
resultNum+=a;
}
}
private void handleM1(){
double a=Double.valueOf(resultText.getText());
if(!resultText.getText().equals("0")){
resultNum+=a;
}
}
private void handleMR(){
String str=String.valueOf(resultNum);
resultText.setText(str);
}
private void handleN(){
if( resultNum <0){
// 阶乘对整数才有意义
resultText.setText("只有整数才有阶乘");
}else if( resultNum ==0) {
// 0!=1,(0 的阶乘是存在的)
resultText.setText("0的阶乘等于1");
}else if( resultNum >0){
double a=-(Double.valueOf(resultText.getText()));
for (int i = (int) (a-1); i > 0; i--){
resultNum*=i;
}
}
}
private void handleSin(){
/*double a=Double.valueOf(resultText.getText());
resultNum=Math.sin(Math.PI/a);*/
//正弦运算
double a = Math.toRadians(resultNum);//把数字转换成 90度
resultNum =Math.sin
...全文
74 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44087232 2019-01-01
  • 打赏
  • 举报
回复



就是运行后这块的功能不能实现,麻烦给位大佬指点下。

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧