Java之实现简单的计算器并打包成exe文件
要求
实现一个最简单的计算器,(能够实现四则运算),实现键盘监听、按钮监听
遇到的问题
组合键盘绑定事件,这个也是在写的时候遇到的问题,可以用用isShiftDown() 确定shift键按下,然后并上另一个键是否被按下,例如:
else if (e.isShiftDown()&&e.getKeyCode()==KeyEvent.VK_F){ // content.setText(content.getText()+"fib"); }
大致开发思想
- 建一个窗口
- 创建一个面板
- 创建计算机所需的组件,一个文本框,按钮根据自己的需要,
- 设置一个布局,这里我用的是网格布局,并把一些需要自己布置的属性进行封装
- 对按钮进行添加事件监听,与键盘上特定的键相连
- 对按钮和文本框的一些属性进行设置,让界面看起来没那么老土。(根据自己的意愿)
- 把组件添加到面板中
代码
package test;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/*
* 做一个简易的计算器
*
* */
public class Calculator extends JFrame implements KeyListener{
JTextField content = new JTextField();
public Calculator(){
this.setSize(500,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
//设置图标
Image icon = new ImageIcon("src/test/image1.jpg").getImage();
this.setIconImage(icon);
JPanel panel = new JPanel();
addKeyListener(this);//添加键盘监听
panel.setBackground(Color.WHITE);
GridBagLayout gridBag = new GridBagLayout();//网格布局
GridBagConstraints c = new GridBagConstraints();//设置约束
GridBagConstraints c1 = new GridBagConstraints();//设置约束
//创建组件
JButton zero = new JButton("0");
JButton one = new JButton("1");
JButton two = new JButton("2");
JButton three = new JButton("3");
JButton four = new JButton("4");
JButton five = new JButton("5");
JButton six = new JButton("6");
JButton seven = new JButton("7");
JButton eight = new JButton("8");
JButton nine = new JButton("9");
JButton clear = new JButton("clear");
JButton enter = new JButton("enter");
JButton multiplicationSign = new JButton("*");
JButton add = new JButton("+");
JButton cut = new JButton("-");
JButton divisionSign = new JButton("/");
JButton point = new JButton(".");
JButton percentSign = new JButton("%");
JButton leftbrackets = new JButton("(");
JButton rightbrackets = new JButton(")");
content.setOpaque(false);//设置透明
content.setFont(new Font("",Font.BOLD,25));//设置字体
content.setHorizontalAlignment(JTextField.RIGHT);//设置输入方向
content.setEditable(false);//设置不可编辑
//设置按钮属性
SetButton(one);
SetButton(two);
SetButton(three);
SetButton(four);
SetButton(five);
SetButton(six);
SetButton(seven);
SetButton(eight);
SetButton(nine);
SetButton(zero);
SetButton(enter);
SetButton(clear);
SetButton(cut);
SetButton(add);
SetButton(multiplicationSign);
SetButton(divisionSign);
SetButton(leftbrackets);
SetButton(rightbrackets);
SetButton(percentSign);
SetButton(point);
clear.setBackground(Color.CYAN);
//设置网格布局的约束
c1.fill = GridBagConstraints.BOTH;
c1.ipadx =100;
c1.ipady =100;
c1.weighty =1;
c1.weightx = 1;
c1.gridheight =4;
c1.gridwidth =4;
c1.gridx =0;
c1.gridy =0;
gridBag.addLayoutComponent(content,c1);
SetgridBag(clear,c,gridBag,0,5,1,1);
SetgridBag(enter,c,gridBag,1,5,1,1);
SetgridBag(zero,c,gridBag,2,5,1,1);
SetgridBag(multiplicationSign,c,gridBag,3,5,1,1);
SetgridBag(seven,c,gridBag,0,6,1,1);
SetgridBag(eight,c,gridBag,1,6,1,1);
SetgridBag(nine,c,gridBag,2,6,1,1);
SetgridBag(add,c,gridBag,3,6,1,1);
SetgridBag(four,c,gridBag,0,7,1,1);
SetgridBag(five,c,gridBag,1,7,1,1);
SetgridBag(six,c,gridBag,2,7,1,1);
SetgridBag(cut,c,gridBag,3,7,1,1);
SetgridBag(one,c,gridBag,0,8,1,1);
SetgridBag(two,c,gridBag,1,8,1,1);
SetgridBag(three,c,gridBag,2,8,1,1);
SetgridBag(divisionSign,c,gridBag,3,8,1,1);
SetgridBag(leftbrackets,c,gridBag,0,9,1,1);
SetgridBag(rightbrackets,c,gridBag,1,9,1,1);
SetgridBag(percentSign,c,gridBag,2,9,1,1);
SetgridBag(point,c,gridBag,3,9,1,1);
//添加监视器
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//清楚
content.setText("");
}
});
zero.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"0");
}
});
one.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"1");
}
});
two.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"2");
}
});
three.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"3");
}
});
four.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"4");
}
});
five.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"5");
}
});
six.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"6");
}
});
seven.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"7");
}
});
eight.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"8");
}
});
nine.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"9");
}
});
multiplicationSign.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"*");
}
});
cut.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"-");
}
});
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"+");
}
});
divisionSign.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"/");
}
});
leftbrackets.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"(");
}
});
rightbrackets.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+")");
}
});
percentSign.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+"%");
}
});
point.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
content.setText(content.getText()+".");
}
});
//设置enter的动作事件
Action Aenter = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
String str = content.getText();
String result =GetValue(str);
content.setText(result);
}
};
enter.addActionListener(Aenter);
enter.addKeyListener(this);
content.addKeyListener(this);
//把组件添加入面板
panel.add(content);
panel.add(zero);
panel.add(one);
panel.add(two);
panel.add(three);
panel.add(four);
panel.add(five);
panel.add(six);
panel.add(seven);
panel.add(eight);
panel.add(nine);
panel.add(clear);
panel.add(enter);
panel.add(multiplicationSign);
panel.add(add);
panel.add(cut);
panel.add(divisionSign);
panel.add(leftbrackets);
panel.add(rightbrackets);
panel.add(percentSign);
panel.add(point);
panel.setLayout(gridBag);
this.add(panel);
this.setVisible(true);
}
public static void main(String[] args) {
new Calculator();
}
public void SetgridBag(Component component,GridBagConstraints c,
GridBagLayout gridBag,int gridx,int gridy,
int gridwidth,int gridHeight ){
//组件1(gridx,gridy)组件的左上角坐标,gridwidth,gridheight:组件占用的网格行数和列数
c.gridx = gridx;
c.gridy = gridy;
c.gridwidth = gridwidth;
c.gridheight = gridHeight;
// weightx=0,weighty=0,意思是组件大小固定,
// 不管面板如何变,自身就那么大,但是如果想让组件随面板变化的话,
// 可以设置weightx和weighty,设置为浮点数也行,其值代表着变化的大小,
// 也就是你宽度设为2,高度设为1的话,拉大面板会使组件越变越宽。
c.weightx = 1;
c.weighty =1;
// ipadx, ipady
// 组件的内部填充(可看做是 组件的内边距),即对组件最小大小的添加量。
// 组件的宽度至少为其最小宽度/高度加上 ipadx/ipady 像素
// c.ipadx = 100;
// c.ipady = 100;
c.fill = GridBagConstraints.BOTH;
gridBag.addLayoutComponent(component,c);
}
public void SetButton(JButton button){
button.setOpaque(true);//设置透明
// button.setBorder(null);//消除边框
button.setContentAreaFilled(false);//去掉背景点击效果
button.setFocusPainted(false);//去掉聚焦
button.setFont(new Font("",Font.BOLD,25));
button.setBackground(Color.RED); //白色背景
button.setForeground(Color.CYAN);
}
public String GetValue(String str){
//JDK自带的类可以实现调用JS的功能,可以实现执行字符串中的运算公式的功能。相当于python中的eval
ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
try {
return String.valueOf(jse.eval(str));
} catch (Exception t) {}
return null;
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
//设置
if(e.getKeyChar() == KeyEvent.VK_ENTER){
String str = content.getText();
String result =GetValue(str);
content.setText(result);
}else if(e.isShiftDown()&&e.getKeyChar() == KeyEvent.VK_SPACE){
content.setText("");
}
if(e.getKeyChar() == KeyEvent.VK_0){
}else if (e.getKeyChar() == KeyEvent.VK_1){
content.setText(content.getText()+1);
} else if (e.getKeyChar() == KeyEvent.VK_2){
content.setText(content.getText()+2);
}else if (e.getKeyChar() == KeyEvent.VK_2){
content.setText(content.getText()+2);
}else if (e.getKeyChar() == KeyEvent.VK_3){
content.setText(content.getText()+3);
}else if (e.getKeyChar() == KeyEvent.VK_4){
content.setText(content.getText()+4);
}else if (e.getKeyChar() == KeyEvent.VK_5){
content.setText(content.getText()+5);
}else if (e.getKeyChar() == KeyEvent.VK_6){
content.setText(content.getText()+6);
}else if (e.getKeyChar() == KeyEvent.VK_7){
content.setText(content.getText()+7);
}else if (e.getKeyChar() == KeyEvent.VK_8){
content.setText(content.getText()+8);
}else if (e.getKeyChar() == KeyEvent.VK_9){
content.setText(content.getText()+9);
}else if (e.isShiftDown()&&e.getKeyCode()==KeyEvent.VK_9){
//isShiftDown() 确定shift键按下
content.setText(content.getText()+"(");
}else if (e.isShiftDown()&&e.getKeyCode()==KeyEvent.VK_0){
content.setText(content.getText()+")");
}else if (e.getKeyCode() == 110){
content.setText(content.getText()+".");
}else if (e.getKeyCode()== 106){
content.setText(content.getText()+"*");
}else if (e.getKeyCode()== 107){
content.setText(content.getText()+"+");
}else if (e.getKeyCode()== 109){
content.setText(content.getText()+"-");
}else if (e.getKeyCode()== 111){
content.setText(content.getText()+"/");
}else if (e.getKeyCode()== 8){
//BackSpace
if (!content.getText().equals("")){
content.setText(content.getText().substring(0,content.getText().length()-1));
}
}else if (e.isShiftDown()&&e.getKeyCode()== KeyEvent.VK_5){
content.setText(content.getText()+"%");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
对代码进行打包
打包工具链接
链接
提取码:bsch
自己生成的exe文件
就不上传了,自己都看不下去。。。