计算器如何实现键盘输入?(附计算器代码)

TheRealBo 2011-05-24 01:14:39
想在以下计算器实现键盘输入,应该怎么写?

public class Calculator extends JFrame implements ActionListener {

// 定义计算器显示框
public JTextField jtf, jtf2;
// 定义0-9按键
public Btn btnE, btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8,
btn9, btnP, btnM, btnX, btnD, C, btnPO, btnA;
// 定义数字面板,操作符面板
public JPanel numP, numP1, numP2, showP, opP, opP1, opP2;
// 定义计算的中间变量
static double num1, num2, num3, result;
// 定义操作符
char opPerator;
boolean next = false;
static boolean flagE = false;// 监督是否按了等号
static boolean isDot = false;// 监督是否按了小数点
static String s = "=", str1, str2, newS, oldS;// 定义变量 创建对像
// TextField txt;
// UndoManager um=new UndoManager();
public JMenuBar jmb;
public JMenu jm;
private JMenuItem SCal, Cal, Exit;

public Calculator() {

super("普通计算器");
// 布局
setSize(480, 357);// setSize(309, 345);
setLocation(700, 100);
Container c = this.getContentPane();
BorderLayout bL = new BorderLayout();
c.setLayout(bL);
jmb = new JMenuBar();
setJMenuBar(jmb);
SCal = new JMenuItem("科学计算器");
Cal = new JMenuItem("普通计算器");
Exit = new JMenuItem("退出(Q)");
Exit.setMnemonic('Q');
Exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
jm = new JMenu("编辑");
jm.add(Cal);
jm.add(SCal);
jm.add(Exit);
jmb.add(jm);
showP = new JPanel();
opP = new JPanel();
opP1 = new JPanel();
opP2 = new JPanel();
numP = new JPanel();
numP1 = new JPanel();
numP2 = new JPanel();

showP.setLayout(new BorderLayout());
opP.setLayout(new BorderLayout());
opP1.setLayout(new GridLayout(3, 2, 2, 2));
opP2.setLayout(new BorderLayout());
numP.setLayout(new BorderLayout());
numP1.setLayout(new GridLayout(3, 3, 2, 2));
numP2.setLayout(new GridLayout(1, 2, 2, 2));
Font font = new Font("New Roma Times", Font.BOLD, 30);

jtf2 = new JTextField("0");
jtf = new JTextField("0");
jtf.setFont(font);
jtf.setEditable(false);//jtf设置不可编辑
jtf2.setEditable(false);

showP.add(jtf2, BorderLayout.NORTH);
showP.add(jtf, BorderLayout.CENTER);
jtf2.setHorizontalAlignment(jtf2.RIGHT);
jtf.setHorizontalAlignment(jtf.RIGHT);
c.add(showP, BorderLayout.NORTH);

/************创建对象***********/

btn9 = new Btn("9");
btn8 = new Btn("8");
btn7 = new Btn("7");
btn6 = new Btn("6");
btn5 = new Btn("5");
btn4 = new Btn("4");
btn3 = new Btn("3");
btn2 = new Btn("2");
btn1 = new Btn("1");
btn0 = new Btn("0");
btnPO = new Btn(".");
C = new Btn("C");
btnA = new Btn("←");
btnP = new Btn("+");
btnM = new Btn("-");
btnX = new Btn("*");
btnD = new Btn("/");
btnE = new Btn("=");

/************设置按钮外观*********/

btn9.setFont(font);
btn9.setForeground(Color.white);
btn8.setFont(font);
btn8.setForeground(Color.white);
btn6.setFont(font);
btn6.setForeground(Color.white);
btn7.setFont(font);
btn7.setForeground(Color.white);
btn5.setFont(font);
btn5.setForeground(Color.white);
btn4.setFont(font);
btn4.setForeground(Color.white);
btn3.setFont(font);
btn3.setForeground(Color.white);
btn2.setFont(font);
btn2.setForeground(Color.white);
btn1.setFont(font);
btn1.setForeground(Color.white);
btn0.setFont(font);
btn0.setForeground(Color.white);
btnPO.setFont(font);
btnPO.setForeground(Color.cyan);
C.setFont(font);
C.setForeground(Color.cyan);
btnA.setFont(font);
btnA.setForeground(Color.cyan);
btnP.setFont(font);
btnP.setForeground(Color.cyan);
btnM.setFont(font);
btnM.setForeground(Color.cyan);
btnX.setFont(font);
btnX.setForeground(Color.cyan);
btnD.setFont(font);
btnD.setForeground(Color.cyan);
btnE.setFont(font);
btnE.setForeground(Color.cyan);
btnE.setEnabled(false);

/************按钮添加到面板***************/

numP1.add(btn7);
numP1.add(btn8);
numP1.add(btn9);
numP1.add(btn4);
numP1.add(btn5);
numP1.add(btn6);
numP1.add(btn1);
numP1.add(btn2);
numP1.add(btn3);
numP.add(numP1, BorderLayout.NORTH);//1-9

numP2.add(btn0);//0
numP2.add(btnPO);//小数点
numP.add(numP2, BorderLayout.SOUTH);

c.add(numP, BorderLayout.WEST);

opP1.add(C);//复原
opP1.add(btnA);//撤消
opP1.add(btnP);//加号
opP1.add(btnM);//减号
opP1.add(btnX);//乘号
opP1.add(btnD);//除号
opP.add(opP1, BorderLayout.NORTH);

opP2.add(btnE);//等号
opP.add(opP2, BorderLayout.SOUTH);

c.add(opP, BorderLayout.EAST);
this.setResizable(false);



/************添加监听器*******************/

btn0.addActionListener(this);
btn1.addActionListener(this);
btn2.addActionListener(this);
btn3.addActionListener(this);
btn4.addActionListener(this);
btn5.addActionListener(this);
btn6.addActionListener(this);
btn7.addActionListener(this);
btn8.addActionListener(this);
btn9.addActionListener(this);
btnP.addActionListener(this);
btnM.addActionListener(this);
btnX.addActionListener(this);
btnD.addActionListener(this);
btnE.addActionListener(this);
btnPO.addActionListener(this);
btnA.addActionListener(this);
C.addActionListener(this);
SCal.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
//代码太长发不了,这里就不加入了
}
...全文
1592 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
TheRealBo 2011-05-25
  • 打赏
  • 举报
回复
行了,谢谢:)
qybao 2011-05-25
  • 打赏
  • 举报
回复 1
因为你是在构造函数中让JTestField获得焦点,而实际上此时JFrame还没有显示,一旦JFrame显示的时候,焦点又会回到JFrame上,最简单的方法就是
在构造函数的最后
setVisible(true); //显示JFrame
requestFocus(false); //JFrame放弃焦点
jtf.requestFocus();//JTestField获得焦点
或者实现WindowListener接口
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) {jtf.requestFocus();} //在窗体显示后让JTextField获得焦点
构造函数里
addWindowListener(this);

在你的代码上修改

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowListener;



import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Calculator extends JFrame implements ActionListener,KeyListener {
// 定义计算器显示框
public JTextField jtf, jtf2;
// 定义0-9按键
public Btn btnE, btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8,
btn9, btnP, btnM, btnX, btnD, C, btnPO, btnA;
// 定义数字面板,操作符面板
public JPanel numP, numP1, numP2, showP, opP, opP1, opP2;
// 定义计算的中间变量
static double num1, num2, num3, result;
// 定义操作符
char opPerator;
boolean next = false;
static boolean flagE = false;// 监督是否按了等号
static boolean isDot = false;// 监督是否按了小数点
static String s = "=", str1, str2, newS, oldS;// 定义变量 创建对像
// TextField txt;
// UndoManager um=new UndoManager();
public JMenuBar jmb;
public JMenu jm;
private JMenuItem SCal, Cal, Exit;

public Calculator() {
super("普通计算器");
// 布局
setSize(490, 365);// setSize(309, 345);
setLocation(700, 100);
Container c = this.getContentPane();
BorderLayout bL = new BorderLayout();
c.setLayout(bL);
jmb = new JMenuBar();
setJMenuBar(jmb);
SCal = new JMenuItem("科学计算器");
Cal = new JMenuItem("普通计算器");
Exit = new JMenuItem("退出(Q)");
Exit.setMnemonic('Q');
Exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
jm = new JMenu("编辑");
jm.add(Cal);
jm.add(SCal);
jm.add(Exit);
jmb.add(jm);
showP = new JPanel();
opP = new JPanel();
opP1 = new JPanel();
opP2 = new JPanel();
numP = new JPanel();
numP1 = new JPanel();
numP2 = new JPanel();

showP.setLayout(new BorderLayout());
opP.setLayout(new BorderLayout());
opP1.setLayout(new GridLayout(3, 2, 2, 2));
opP2.setLayout(new BorderLayout());
numP.setLayout(new BorderLayout());
numP1.setLayout(new GridLayout(3, 3, 2, 2));
numP2.setLayout(new GridLayout(1, 2, 2, 2));
Font font = new Font("New Roma Times", Font.BOLD, 30);

jtf2 = new JTextField("0");
jtf = new JTextField("0");
jtf.setFont(font);
jtf.setEditable(false);
jtf2.setEditable(false);
//jtf.requestFocus();

showP.add(jtf2, BorderLayout.NORTH);
showP.add(jtf, BorderLayout.CENTER);
jtf2.setHorizontalAlignment(jtf2.RIGHT);
jtf.setHorizontalAlignment(jtf.RIGHT);

c.add(showP, BorderLayout.NORTH);

/************创建对象***********/

btn9 = new Btn("9");
btn8 = new Btn("8");
btn7 = new Btn("7");
btn6 = new Btn("6");
btn5 = new Btn("5");
btn4 = new Btn("4");
btn3 = new Btn("3");
btn2 = new Btn("2");
btn1 = new Btn("1");
btn0 = new Btn("0");
btnPO = new Btn(".");
C = new Btn("C");
btnA = new Btn("←");
btnP = new Btn("+");
btnM = new Btn("-");
btnX = new Btn("*");
btnD = new Btn("/");
btnE = new Btn("=");

/************设置按钮外观*********/

btn9.setFont(font);
btn9.setForeground(Color.white);
btn8.setFont(font);
btn8.setForeground(Color.white);
btn6.setFont(font);
btn6.setForeground(Color.white);
btn7.setFont(font);
btn7.setForeground(Color.white);
btn5.setFont(font);
btn5.setForeground(Color.white);
btn4.setFont(font);
btn4.setForeground(Color.white);
btn3.setFont(font);
btn3.setForeground(Color.white);
btn2.setFont(font);
btn2.setForeground(Color.white);
btn1.setFont(font);
btn1.setForeground(Color.white);
//btn1.setRequestFocusEnabled(false);//lost focus so that text can have a keylistener
btn0.setFont(font);
btn0.setForeground(Color.white);
btnPO.setFont(font);
btnPO.setForeground(Color.cyan);
C.setFont(font);
C.setForeground(Color.cyan);
btnA.setFont(font);
btnA.setForeground(Color.cyan);
btnP.setFont(font);
btnP.setForeground(Color.cyan);
btnM.setFont(font);
btnM.setForeground(Color.cyan);
btnX.setFont(font);
btnX.setForeground(Color.cyan);
btnD.setFont(font);
btnD.setForeground(Color.cyan);
btnE.setFont(font);
btnE.setForeground(Color.cyan);
btnE.setEnabled(false);


jtf.requestFocus();

/************按钮添加到面板***************/

numP1.add(btn7);
numP1.add(btn8);
numP1.add(btn9);
numP1.add(btn4);
numP1.add(btn5);
numP1.add(btn6);
numP1.add(btn1);
numP1.add(btn2);
numP1.add(btn3);
numP.add(numP1, BorderLayout.NORTH);//1-9

numP2.add(btn0);//0
numP2.add(btnPO);//小数点
numP.add(numP2, BorderLayout.SOUTH);

c.add(numP, BorderLayout.WEST);

opP1.add(C);//复原
opP1.add(btnA);//撤消
opP1.add(btnP);//加号
opP1.add(btnM);//减号
opP1.add(btnX);//乘号
opP1.add(btnD);//除号
opP.add(opP1, BorderLayout.NORTH);

opP2.add(btnE);//等号
opP.add(opP2, BorderLayout.SOUTH);

c.add(opP, BorderLayout.EAST);


/************添加监听器*******************/
//btn0.addKeyListener((KeyListener) this);
btn0.addActionListener(this);
btn1.addActionListener(this);
btn2.addActionListener(this);
btn3.addActionListener(this);
btn4.addActionListener(this);
btn5.addActionListener(this);
btn6.addActionListener(this);
btn7.addActionListener(this);
btn8.addActionListener(this);
btn9.addActionListener(this);
btnP.addActionListener(this);
btnM.addActionListener(this);
btnX.addActionListener(this);
btnD.addActionListener(this);
btnE.addActionListener(this);
btnPO.addActionListener(this);
btnA.addActionListener(this);
C.addActionListener(this);
SCal.addActionListener(this);
/***************/
jtf.addKeyListener(this);

addWindowListener(this); //添加事件监听
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true); //显示窗体
//requestFocus(false); //简单的做法是显示窗体后设置焦点
//jtf.requestFocus();

}


public void actionPerformed(ActionEvent e) {

}
/****************************/

public void keyTyped(KeyEvent e){

char x=e.getKeyChar();
if(x>='0'&&x<='9'){
jtf.setText(jtf.getText()+String.valueOf(x));
}



}
@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}

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) {jtf.requestFocus();} //或者在窗体显示在事件里让JTextField获得焦点

public static void main(String[] args) {new Calculator();} //测试

}
TheRealBo 2011-05-24
  • 打赏
  • 举报
回复
参考了网上的,自己修改了一下,代码如下。但是还是不行,得单击JTestField才能从键盘输入
package com.jluzh.javaex90;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Calculator extends JFrame implements ActionListener,KeyListener {
// 定义计算器显示框
public JTextField jtf, jtf2;
// 定义0-9按键
public Btn btnE, btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8,
btn9, btnP, btnM, btnX, btnD, C, btnPO, btnA;
// 定义数字面板,操作符面板
public JPanel numP, numP1, numP2, showP, opP, opP1, opP2;
// 定义计算的中间变量
static double num1, num2, num3, result;
// 定义操作符
char opPerator;
boolean next = false;
static boolean flagE = false;// 监督是否按了等号
static boolean isDot = false;// 监督是否按了小数点
static String s = "=", str1, str2, newS, oldS;// 定义变量 创建对像
// TextField txt;
// UndoManager um=new UndoManager();
public JMenuBar jmb;
public JMenu jm;
private JMenuItem SCal, Cal, Exit;

public Calculator() {
super("普通计算器");
// 布局
setSize(490, 365);// setSize(309, 345);
setLocation(700, 100);
Container c = this.getContentPane();
BorderLayout bL = new BorderLayout();
c.setLayout(bL);
jmb = new JMenuBar();
setJMenuBar(jmb);
SCal = new JMenuItem("科学计算器");
Cal = new JMenuItem("普通计算器");
Exit = new JMenuItem("退出(Q)");
Exit.setMnemonic('Q');
Exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
jm = new JMenu("编辑");
jm.add(Cal);
jm.add(SCal);
jm.add(Exit);
jmb.add(jm);
showP = new JPanel();
opP = new JPanel();
opP1 = new JPanel();
opP2 = new JPanel();
numP = new JPanel();
numP1 = new JPanel();
numP2 = new JPanel();

showP.setLayout(new BorderLayout());
opP.setLayout(new BorderLayout());
opP1.setLayout(new GridLayout(3, 2, 2, 2));
opP2.setLayout(new BorderLayout());
numP.setLayout(new BorderLayout());
numP1.setLayout(new GridLayout(3, 3, 2, 2));
numP2.setLayout(new GridLayout(1, 2, 2, 2));
Font font = new Font("New Roma Times", Font.BOLD, 30);

jtf2 = new JTextField("0");
jtf = new JTextField("0");
jtf.setFont(font);
jtf.setEditable(false);
jtf2.setEditable(false);
//jtf.requestFocus();

showP.add(jtf2, BorderLayout.NORTH);
showP.add(jtf, BorderLayout.CENTER);
jtf2.setHorizontalAlignment(jtf2.RIGHT);
jtf.setHorizontalAlignment(jtf.RIGHT);

c.add(showP, BorderLayout.NORTH);

/************创建对象***********/

btn9 = new Btn("9");
btn8 = new Btn("8");
btn7 = new Btn("7");
btn6 = new Btn("6");
btn5 = new Btn("5");
btn4 = new Btn("4");
btn3 = new Btn("3");
btn2 = new Btn("2");
btn1 = new Btn("1");
btn0 = new Btn("0");
btnPO = new Btn(".");
C = new Btn("C");
btnA = new Btn("←");
btnP = new Btn("+");
btnM = new Btn("-");
btnX = new Btn("*");
btnD = new Btn("/");
btnE = new Btn("=");

/************设置按钮外观*********/

btn9.setFont(font);
btn9.setForeground(Color.white);
btn8.setFont(font);
btn8.setForeground(Color.white);
btn6.setFont(font);
btn6.setForeground(Color.white);
btn7.setFont(font);
btn7.setForeground(Color.white);
btn5.setFont(font);
btn5.setForeground(Color.white);
btn4.setFont(font);
btn4.setForeground(Color.white);
btn3.setFont(font);
btn3.setForeground(Color.white);
btn2.setFont(font);
btn2.setForeground(Color.white);
btn1.setFont(font);
btn1.setForeground(Color.white);
//btn1.setRequestFocusEnabled(false);//lost focus so that text can have a keylistener
btn0.setFont(font);
btn0.setForeground(Color.white);
btnPO.setFont(font);
btnPO.setForeground(Color.cyan);
C.setFont(font);
C.setForeground(Color.cyan);
btnA.setFont(font);
btnA.setForeground(Color.cyan);
btnP.setFont(font);
btnP.setForeground(Color.cyan);
btnM.setFont(font);
btnM.setForeground(Color.cyan);
btnX.setFont(font);
btnX.setForeground(Color.cyan);
btnD.setFont(font);
btnD.setForeground(Color.cyan);
btnE.setFont(font);
btnE.setForeground(Color.cyan);
btnE.setEnabled(false);


jtf.requestFocus();

/************按钮添加到面板***************/

numP1.add(btn7);
numP1.add(btn8);
numP1.add(btn9);
numP1.add(btn4);
numP1.add(btn5);
numP1.add(btn6);
numP1.add(btn1);
numP1.add(btn2);
numP1.add(btn3);
numP.add(numP1, BorderLayout.NORTH);//1-9

numP2.add(btn0);//0
numP2.add(btnPO);//小数点
numP.add(numP2, BorderLayout.SOUTH);

c.add(numP, BorderLayout.WEST);

opP1.add(C);//复原
opP1.add(btnA);//撤消
opP1.add(btnP);//加号
opP1.add(btnM);//减号
opP1.add(btnX);//乘号
opP1.add(btnD);//除号
opP.add(opP1, BorderLayout.NORTH);

opP2.add(btnE);//等号
opP.add(opP2, BorderLayout.SOUTH);

c.add(opP, BorderLayout.EAST);


/************添加监听器*******************/
//btn0.addKeyListener((KeyListener) this);
btn0.addActionListener(this);
btn1.addActionListener(this);
btn2.addActionListener(this);
btn3.addActionListener(this);
btn4.addActionListener(this);
btn5.addActionListener(this);
btn6.addActionListener(this);
btn7.addActionListener(this);
btn8.addActionListener(this);
btn9.addActionListener(this);
btnP.addActionListener(this);
btnM.addActionListener(this);
btnX.addActionListener(this);
btnD.addActionListener(this);
btnE.addActionListener(this);
btnPO.addActionListener(this);
btnA.addActionListener(this);
C.addActionListener(this);
SCal.addActionListener(this);
/***************/
jtf.addKeyListener(this);


}


public void actionPerformed(ActionEvent e) {

}
/****************************/

public void keyTyped(KeyEvent e){

char x=e.getKeyChar();
if(x>='0'&&x<='9'){
jtf.setText(jtf.getText()+String.valueOf(x));
}



}
@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}

}
TheRealBo 2011-05-24
  • 打赏
  • 举报
回复
麻烦高手指教一下

58,454

社区成员

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

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