主要用到的就是布局和点击事件,菜单没写功能,能实现简单的四则运算,用非常简单的方法写的,代码放出供新手一起学习,我也是新手。
截图献丑:
package com.software.GUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
/*
* 目前存在的问题:
* 1.运算得出结果后,再次直接输入数值,文本框数值不会清零。
* 2.运算符+-x/点击一个后再点击第二个还是会输出第一次点击的运算符其结果。
* 3.能输入多个小数点问题。(已解决)
* */
public class Calculator{
private JFrame frame;
private JPanel panel;
private JPanel panelCenter;
private JButton btn[];
private JTextField txt;//显示框
private JMenuBar menuBar;
private JMenu menuLook,menuEdit,menuHelp;
private JMenuItem miStandard,miScientific,miProgrammer,mecopy,mecut,mehistory,mhabout;
private double num1, num2, result; // 定义三个double类型的变量
private char c; // 定义字符型变量c,来保存操作符号
private JButton cc;//清除按钮
public Calculator() {
/*菜单*/
menuBar = new JMenuBar();
menuLook = new JMenu("查看(V)");
miStandard = new JMenuItem("标准型");
miScientific = new JMenuItem("科学型");
miProgrammer = new JMenuItem("程序员型");
menuEdit = new JMenu("编辑(E)");
mecopy = new JMenuItem("复制");
mecut = new JMenuItem("粘贴");
mehistory = new JMenuItem("历史记录");
menuHelp = new JMenu("帮助(H)");
mhabout = new JMenuItem("关于");
//菜单项添加到菜单里
menuLook.add(miStandard);
//menuLook.addSeparator();//分割线
menuLook.add(miScientific);
//menuLook.addSeparator();
menuLook.add(miProgrammer);
//快捷键
menuLook.setMnemonic(KeyEvent.VK_V);
menuEdit.setMnemonic(KeyEvent.VK_E);
menuEdit.add(mecopy);
menuLook.addSeparator();
menuEdit.add(mecut);
menuLook.addSeparator();
menuEdit.add(mehistory);
menuHelp.setMnemonic(KeyEvent.VK_H);
menuHelp.add(mhabout);
//组合键
miStandard.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
mecopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
mecut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
mehistory.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
//菜单添加到菜单栏里
menuBar.add(menuLook);
menuBar.add(menuEdit);
menuBar.add(menuHelp);
/*计算器开始*/
frame = new JFrame("计算器");
panel = new JPanel();
panelCenter = new JPanel();
//显示框
txt = new JTextField(19);//长度
cc = new JButton("clear");
btn = new JButton[16];
String str = "123+456-789*0.=/"; // 创建字符串 也就是每个按钮的文本
for (int i = 0; i < str.length(); i++) { // 对字符串进行遍历 截取字符
btn[i] = new JButton(str.charAt(i) + ""); // 根据字符创建按钮 并将按钮放入jbs集合
}
btnLayout(); // 调用布局方法
addEventHandler();// 调用addEventHandler方法
show();// 调用showMe方法
}
/*按钮布局*/
private void btnLayout() {
panelCenter.setLayout(new GridLayout(4, 4,10,10)); // 设定该面板为4行4列布局
for (int i = 0; i < 16; i++) { // 循环16个按钮
panelCenter.add(btn[i]); // 将按钮一个个取出来放到panelCenter里面
}
}
/*点击事件*/
private void addEventHandler() {
ActionListener listener = new ActionListener() {
// 点击触发事件
public void actionPerformed(ActionEvent e) {
JButton jb = (JButton) e.getSource();// 获取到事件源 也就是被点击的哪个按钮
String str = jb.getText().trim();// 把字符串的首尾空格去掉!
if ("0123456789".indexOf(str) != -1) {// 如果是数字
txt.setText(txt.getText() + str); // 将文本框的内容加上当前的输入的数字
return;
}
// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
if ((str.equals(".")) && (txt.getText().indexOf(".") < 0)){
txt.setText(txt.getText() + str); //
return;
}
if ("+-*/".indexOf(str) != -1) {// 如果是加减乘除
num1 = Double.parseDouble(txt.getText());// 先获取文本框的值
// 并保存到num1
txt.setText(""); // 然后将文本框清空
c = str.charAt(0); // 获取操作符号 并保存到c
txt.setText("");// 这里重复操作 垃圾代码
return;
}
if (str.equals("=")) {// 如果输入的等于操作
num2 = Double.parseDouble(txt.getText()); // 获取文本框的值 保存到num2
switch (c) {// 判断之前输入的符号
case '+':
result = num1 + num2;
break;// 这里的四个就是做加减乘除操作 要点就是讲之前保存的num1 和 num2获取出来 进行操作
// 将结果保存 result
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
txt.setText(Double.toString(result));// 把result的值 付给当前文本框
return;
}
if (e.getActionCommand().equals("clear")) {// 如果按时 清除按钮
txt.setText(""); // 情况文本框内容 不过这里也有bug 个人认为应该把num1 和 num2也清0
return;
}
}
};
// 对txt集合进行遍历
for (int i = 0; i < btn.length; i++) {
// 给按钮添加事件
btn[i].addActionListener(listener);
}
// 对清除按钮添加事件
cc.addActionListener(listener);
}
private void show() {
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setJMenuBar(menuBar);//菜单项
panel.add(txt,BorderLayout.NORTH);//显示框
panel.add(panelCenter,BorderLayout.CENTER);//16按钮
panel.add(cc,BorderLayout.SOUTH);//清除按钮
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);//窗口缩放
frame.setLocationRelativeTo(null);
frame.setContentPane(panel);
frame.setVisible(false);
frame.setVisible(true); // 设置可见
frame.setSize(250, 270);
frame.setIconImage(frame.getToolkit().getImage("d:\\Calculator.png"));
}
public static void main(String[] args) {
new Calculator();
}
}
Comments (暂无评论)