本人正在做一个计算器,其中能响应键盘事件,加减乘除怎么实现?

zhoukai1980 2004-12-16 02:41:12
我用VK_ADD也不是 + 阿

请指教
...全文
673 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
water2004 2004-12-18
  • 打赏
  • 举报
回复
可以用汉字。还有两个button类没给出。你自己写吧。应该能写出来
light56 2004-12-18
  • 打赏
  • 举报
回复
/** CalculatorApplet 计算器
* 操作数? (第一位) 完成后标志位F; (非第一) String的连接
* "-" ? (负号) 完成后标志位F; (减号) 运算符保存
*
* 是运算符: A+B-C (输入"-")? (A+B)运算并显示结果.
* 保持"-"为下次运算做准备
* @version 1.20 27 Jun 1998
* @author Cay Horstmann
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CalculatorApplet extends JApplet
{
public void init()
{ Container contentPane = getContentPane(); // Returns the contentPane object for this applet.
contentPane.add(new CalculatorPanel());
}
}

class CalculatorPanel extends JPanel implements ActionListener
{
private JTextField display;
private double arg = 0; // 运算结果存储区
private String op = "=";
private boolean start = true;

public CalculatorPanel()
{
setLayout(new BorderLayout());

display = new JTextField("0");
display.setEditable(false);
add(display, "North");

JPanel p = new JPanel(); // 按钮面板布局
p.setLayout(new GridLayout(4, 4));

String buttons = "789/456*123-0.=+";
for (int i = 0; i < buttons.length(); i++)
addButton(p, buttons.substring(i, i + 1));
/*
从i开始, 到i结束. 每次返回一个字符作为创建要素
返回是该字符串子串的新字符串。
子串开始于指定的 beginIndex ,
且扩展到索引为 endIndex - 1 的位置。
*/
add(p, "Center");
}

private void addButton(Container c, String s) // c = JPanel
{ // 创建新按钮, 放置到面板, 添加监听器, 一气呵成
JButton b = new JButton(s);
c.add(b);
b.addActionListener(this);
}

public void actionPerformed(ActionEvent evt)
{
String s = evt.getActionCommand(); // 返回与该动作相关的命令名。

if ('0' <= s.charAt(0) && s.charAt(0) <= '9'
|| s.equals("."))
{ // 操作数
if (start)
{ // 操作数的第一位
display.setText(s);
start = false;
}
else
{ // 非操作数的第一位
display.setText(display.getText() + s);
}
}

else // 是'-'吗?
{ if (start)
{ if (s.equals("-")) // 负数处理
{
display.setText(s);
start = false;
}
else op = s;
}

else // 开始运算 A+B-C
{ calculate(Double.parseDouble
(display.getText())); // A+B
// 有必要判断吗?
// display.getText() 是数字吗?
// 是: 计算; 不是: 操作符刷新
op = s; // - 运算符保存起, 为下次运算做准备
start = true; // 为下一个操作数的输入做准备
}
}
}

public void calculate(double n)
{ if (op.equals("+")) arg += n; // 运算符是前一次输入的
else if (op.equals("-")) arg -= n;
else if (op.equals("*")) arg *= n;
else if (op.equals("/")) arg /= n;
else if (op.equals("=")) arg = n;

display.setText("" + arg); // 显示运算结果
}

}
尹立 2004-12-17
  • 打赏
  • 举报
回复
water2004(@-@)
标识符难道可以用汉字表示吗?
汉字最高位是1 而字母最高位是0
java不是只允许以字母开头的标识符吗?
nako_ruru 2004-12-17
  • 打赏
  • 举报
回复
栈 stack
说好不能打脸 2004-12-17
  • 打赏
  • 举报
回复
楼上的你给别人写了那么多,几句注释也没有,你叫别人咋看?
其实主要有两点,第一点就是监听器,建议使用KeyAdapter类(适配器);第二点就是如何将字符串转化为int型:
1、键盘监听器及实现:

import java.awt.Button;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
public class Test2 {
/*这里只写如何向按钮添加监听器,并用KeyAdapter作出相应事件*/
public Test2(){
Button myButton = new Button();
myButton.addKeyListener(new Adapter());//添加监听器
}

/**
* 此类用于处理键盘事件,还可以覆盖很多方法,详见API
* */
class Adapter extends KeyAdapter{
public void keyPressed(KeyEvent e){
e.getKeyChar();//接受键盘输入的字符
}
}
}

2、将字符串转化为int型
String.valueOf(int i),这是一个静态方法
另外还有一个方法可以将int型转化为字符串型
Integer.parseInt(String s), 这也是一个静态方法
bradwoo8621 2004-12-17
  • 打赏
  • 举报
回复
qi其他的一样
bradwoo8621 2004-12-17
  • 打赏
  • 举报
回复
operationButton[0].registerKeyboardAction(new ActionListener(){
public void actionPerformed(ActionEvent e) {
operationButton[0].doClick();
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ADD, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
当焦点在窗口任何地方, 按下+, 就会发送一个操作+按钮的点击事件.
water2004 2004-12-17
  • 打赏
  • 举报
回复
public void actionPerformed(ActionEvent e)
{

if(e.getSource() instanceof NumberButton)
{
NumberButton b=(NumberButton)e.getSource();
if(链表.size()==0)
{
int number=b.getNumber();
链表.add(""+number);
resultShow.setText(""+number);
是否按下等号=false;
}

else if(链表.size()==1&&是否按下等号==false)
{
int number=b.getNumber();
String num=(String)链表.getFirst();
String s=num.concat(""+number);
链表.set(0,s);
resultShow.setText(s);
}
else if(链表.size()==1&&是否按下等号==true)
{
int number=b.getNumber();
链表.removeFirst();
链表.add(""+number);
是否按下等号=false;
resultShow.setText(""+number);
}
else if(链表.size()==2)
{
int number=b.getNumber();
链表.add(""+number);

resultShow.setText(""+number);
}
else if(链表.size()==3)
{
int number=b.getNumber();
String num=(String)链表.getLast();
String s=num.concat(""+number);
链表.set(2,s);
resultShow.setText(s);
}
}
else if(e.getSource() instanceof OperationButton)
{
OperationButton b=(OperationButton)e.getSource();
if(链表.size()==1)
{
String fuhao=b.get运算符号();

链表.add(fuhao);
}
else if(链表.size()==2)
{
String fuhao=b.get运算符号();
链表.set(1,fuhao);
}
else if(链表.size()==3)
{
String fuhao=b.get运算符号();
String number1=(String)链表.getFirst();
String number2=(String)链表.getLast();
String 运算符号=(String)链表.get(1);
try
{
double n1=Double.parseDouble(number1);
double n2=Double.parseDouble(number2);
double n=0;
if(运算符号.equals("+"))
{
n=n1+n2;
}
else if(运算符号.equals("-"))
{
n=n1-n2;
}
else if(运算符号.equals("*"))
{
n=n1*n2;
}
else if(运算符号.equals("/"))
{
n=n1/n2;
}
链表.clear();
链表.add(""+n);
链表.add(fuhao);
resultShow.setText(""+n);
}
catch(Exception ee)
{
}
}
}
else if(e.getSource()==等号按钮)
{
是否按下等号=true;
if(链表.size()==1||链表.size()==2)
{
String num=(String)链表.getFirst();
resultShow.setText(""+num);
}
else if(链表.size()==3)
{
String number1=(String)链表.getFirst();
String number2=(String)链表.getLast();
String 运算符号=(String)链表.get(1);
try
{
double n1=Double.parseDouble(number1);
double n2=Double.parseDouble(number2);
double n=0;
if(运算符号.equals("+"))
{
n=n1+n2;
}
else if(运算符号.equals("-"))
{
n=n1-n2;
}
else if(运算符号.equals("*"))
{
n=n1*n2;
}
else if(运算符号.equals("/"))
{
n=n1/n2;
}
resultShow.setText(""+n);
链表.set(0,""+n);
链表.removeLast();
链表.removeLast();

}
catch(Exception ee)
{
}
}
}
water2004 2004-12-17
  • 打赏
  • 举报
回复
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.LinkedList;
import java.text.NumberFormat;
public class ComputerPad extends Frame implements ActionListener
{
NumberButton numberButton[];
OperationButton oprationButton[];
Button 小数点按钮,正负号按钮,退格按钮,
求倒数按钮,等号按钮,清零按钮;
Panel panel;
JTextField resultShow;
String 运算符号[]={"+","-","*","/"};
LinkedList 链表;
boolean 是否按下等号=false;

public ComputerPad()
{
super("计算器");
链表=new LinkedList();
numberButton=new NumberButton[10];
for(int i=0;i<=9;i++)
{
numberButton[i]=new NumberButton(i);
numberButton[i].addActionListener(this);
}
oprationButton=new OperationButton[4];
for(int i=0;i<4;i++)
{
oprationButton[i]=new OperationButton(运算符号[i]);
oprationButton[i].addActionListener(this);
}
小数点按钮=new Button(".");
正负号按钮 =new Button("+/-");
等号按钮=new Button("=");
求倒数按钮=new Button("1/x");
退格按钮=new Button("退格");
清零按钮=new Button("C");
清零按钮.setForeground(Color.red);
退格按钮.setForeground(Color.red);
等号按钮.setForeground(Color.red);
求倒数按钮.setForeground(Color.blue);
正负号按钮.setForeground(Color.blue);
小数点按钮.setForeground(Color.blue);
退格按钮.addActionListener(this);
清零按钮.addActionListener(this);
等号按钮.addActionListener(this);
小数点按钮.addActionListener(this);
正负号按钮.addActionListener(this);
求倒数按钮.addActionListener(this);
resultShow=new JTextField(10);
resultShow.setHorizontalAlignment(JTextField.RIGHT);
resultShow.setForeground(Color.blue);
resultShow.setFont(new Font("TimesRoman",Font.PLAIN,14));
resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
resultShow.setBackground(Color.white);
resultShow.setEditable(false);
panel=new Panel();
panel.setLayout(new GridLayout(4,5));

panel.add(numberButton[1]);
panel.add(numberButton[2]);
panel.add(numberButton[3]);
panel.add(oprationButton[0]);
panel.add(清零按钮);

panel.add(numberButton[4]);
panel.add(numberButton[5]);
panel.add(numberButton[6]);
panel.add(oprationButton[1]);
panel.add(退格按钮);

panel.add(numberButton[7]);
panel.add(numberButton[8]);
panel.add(numberButton[9]);
panel.add(oprationButton[2]);
panel.add(求倒数按钮);

panel.add(numberButton[0]);
panel.add(正负号按钮);
panel.add(小数点按钮);
panel.add(oprationButton[3]);
panel.add(等号按钮);
add(panel,BorderLayout.CENTER);
add(resultShow,BorderLayout.NORTH);

addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
setVisible(true);
setBounds(100,50,240,180);
setResizable(false);
validate();
}
water2004 2004-12-16
  • 打赏
  • 举报
回复
我给你程序,你自己看。给多点分我我不够用了。如何!
zhangliecheng 2004-12-16
  • 打赏
  • 举报
回复
jTextField.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ADD){
System.out.println(true);
}
}
});
classjava 2004-12-16
  • 打赏
  • 举报
回复
不要用键盘事件,用普通监听器,然后对该按钮加个shortcut,如同"+"button就叫个VK_ADD
thomas_20 2004-12-16
  • 打赏
  • 举报
回复
可以的啊:
jTextField.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ADD){
System.out.println(true);
}
}
});

试试,^_^
zhoukai1980 2004-12-16
  • 打赏
  • 举报
回复
没有人会阿,还是自己研究把
vgvg 2004-12-16
  • 打赏
  • 举报
回复
加就直接用+
取出a,取出b.

int i=Integer.parse(a)+Integer.parse(b);
目录 引言 1 第一章 设计原理及要求 2 1.1 设计方案的确定 2 1.2 系统的设计方案 2 1.3 系统的设计要求 2 第二章 硬件模块设计 4 2.1 单片机AT89C51 4 2.1.1 AT89C51芯片的特点 5 2.1.2 管脚说明 5 2.1.3 振荡器特性 7 2.1.4 芯片擦除 7 2.2 键盘控制模块 7 2.2.1 矩阵键盘的工作原理 8 2.2.2 键盘电路主要器件介绍 8 2.3 LCD显示模块 10 2.3.1 显示电路 11 2.3.2 LCD1602主要技术参数 11 2.3.3 引脚功能说明 11 2.4 运算模块(单片机控制) 12 第三章 软件设计 14 3.1 功能介绍 14 3.2系统流程图 14 3.3 程序 16 第四章 系统调试 17 4.1软件介绍 17 4.1.1 Keil uVision2仿真软件简介 17 4.1.2 protues简介 17 4.2 软件调试 18 4.2.1 软件分析及常见故障 19 4.2.2 仿真结果演示 20 4.3 硬件调试 21 结束语 23 参考文献 24 附录 25 致谢 36 引言 计算工具最早诞生于中国,中国古代最早采用的一种计算工具叫筹策,也被叫算筹 。这种算筹多用竹子制成,也有用木头,兽骨充当材料的,约二百七十枚一束,放在布 袋里可随身携带。另外直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一 项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的"纳皮尔 算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能加、减、乘、除 、乘方和开方运算,甚至可以计算三角函数、指数函数和对数函数。这些计算工具不仅 带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛 的计算工具。1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一 部机械式计算器,在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另 一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现 在另一个窗口中,但是它只能加减运算。1694年,莱布尼兹在德国将其改进成可以进 行乘除的计算。此后,一直到20世纪50年代末才有电子计算器的出现。 第一章 设计原理及要求 1.1 设计方案的确定 本设计是以单片机AT89C51为核心的简易计算器设计,要通过芯片AT89C51实现计算器 程序运行来完成加、减、乘和除的简单计算功能。 本设计运算模块由AT89C51实现,数据输入模块由4*4矩阵键盘电路实现,输出数据模 块由LCD显示电路实现,再外加一个时钟电路和一个复位电路完成整个简易计算器的设计 。 1.2 系统的设计方案 本设计由以下几部分组成:AT89C51单片机系统(运算模块)、键盘电路、显示电路 、时钟电路和复位电路构成,计算器系统框图如图1-1所示。 图1-1 计算器系统框图 1.3 系统的设计要求 为了更好地实现系统的功能,硬件电路的设计应该遵循以下原则: 1、优化硬件电路 采用软件设计与硬件设计相结合的方法。尽管采用软件来实现硬件系统的功能时,也 许响应的时间会比单纯使用硬件时长,而且还要占用微处理器(MCU)的时间;但是,用 软件实现硬件的功能可以简化硬件结构,提高电路的可靠性。所以,在设计本系统的时 候,在满足可靠性和实时性的前提下,尽可能地通过软件来实现硬件功能。 2、可靠性及抗干扰设计 根据可靠性设计理论,系统所用芯片数量越少,系统的平均无故障时间越长。而且, 所用芯片数量越少,地址和数据总线在电路板上受干扰的可能性也就越小。因此,系统 的设计思想是在满足功能的情况下争取较少数量的芯片。 3、灵活的功能扩展 功能扩展是否灵活是衡量一个系统优劣的重要指标之一。一次设计往往不能完全考虑 到系统的各个方面,系统需要不断完善以及进行功能升级。进行功能扩展时,应该在原 有设计的基础上,通过修改软件程序和少量硬件完成。对于本系统而言,就是要求在系 统硬件不变的情况下,能够通过修改软件程序,完成功能的升级和扩展。 根据提出的系统设计方案,结合以上三条原则,确定了系统硬件的设计。计算器主要 由以下一些功能模块组成:非编码键盘模块、运算模块(单片机内部)和LCD液晶显示模 块等。 该系统的硬件设计采用了模块化的设计方法。AT89C51单片机、LCD液晶显示屏显示电 路和键盘电路是整个电路的核心,它们能实现系统的功能要求。 简易计算器主要包括:键盘电路、运算电路和输出显示电路。 第二章 硬件模块设计 在本设计中主要用到的硬件:单片机AT89C51、液晶显示屏LCD1602 、4*4矩阵键盘。 单片机AT89C51的硬件资源分配

62,614

社区成员

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

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