如图,这个计算器是键盘鼠标均可输入的,但是运行后不能直接鼠标输入,要先随便点击一个按钮才能继续用键盘输入,应该是一开始焦点之类的问题吧帮忙解决下,多谢~~~~~
解决方案 »
- Swing布局请教,涉及GridBagLayout
- 如何在保存文件时添加默认后缀名?
- 关于在读取输入流时的while循环和read方法
- JTextPane中的光标问题
- 问一个Math.random()方法和取余的计算问题
- 一个关于异常抛出的简单问题,望路过的兄弟们给以指点……
- 关于dom4j如何读取xml内容的问题?
- 下载pdf格式文件时,浏览器总是自动将这个pdf文件打开.我想下载时弹出保存文件对话框.xdjm们有没有什么办法?
- 数组赋值错误,在线等.......
- 一个简单的问题,Java编程思想(2nd)里的。
- 范型<? extends A> 到底表示什么意思?
- ThreadLocal 与 给每个线程实例传递一个新的变量,这两种做法的区别
import java.awt.event.*;
import javax.swing.*;
import java.math.*;//创建计算器Calculator类,实现ActionListener接口
public class Calculator implements ActionListener, KeyListener
{
//定义变量和按钮数组
private String[] names = {"+","-","*","/","1","2","3","-","4","5","6","0","7","8","9","="};
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
private JButton[] buttonArray = new JButton[names.length];
private boolean append = false;//默认追加为false
private String operator = "+";//默认运算符为“+”
private String s1 = "0";//默认字符为0
private String ss = "0";//默认字符为0
//创建可以显示20个字符的文本框
TextField jtf = new TextField(20);
//构造方法
public Calculator() {}
public Calculator(String title)
{
//创建窗口、面板,并设置面板布局为网格布局
Frame jf = new Frame(title);
Panel jp = new Panel();
jp.setLayout(new GridLayout(4, 4));
//依次添加按钮到面板中,并为按钮注册监听器
for(int i=0; i<buttonArray.length; i++)
{
buttonArray[i] = new JButton(names[i]);
buttonArray[i].addActionListener(this);
buttonArray[i].addKeyListener(this);
jp.add(buttonArray[i]);
}
//添加文本框到窗体中
jf.add(jtf, BorderLayout.NORTH);
jf.add(jp);//添加面板到窗体中
jtf.setText("0");
jtf.setEditable(false);//设置文本框为不可编辑状态
//设置窗体属性
jf.pack();//系统自动设置大小和位置
jf.setVisible(true);
jf.addWindowListener (new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
} );
//jf.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);
}
//实现监听接口的actionPerformed方法
public void actionPerformed(ActionEvent e)
{
String comm = e.getActionCommand();
if(comm.matches("\\d"))//用正则表达式判断输出的是否是0~9
{
if(append)//如果是,追加显示
{
String temp = jtf.getText();
jtf.setText(temp + comm);
}else //如果不是,显示该字符并将追加设置为true
{
jtf.setText(comm);
append = true;
}
}
else if(comm.equals("."))//输入小数点时
{
String temp = jtf.getText();
if(temp.indexOf(".") == -1 && append) {
jtf.setText(temp + comm);
append = true;
} else if(!append) {
jtf.setText("0" + comm);
append = true;
}
}else if("+-*/".indexOf(comm)!= -1)//输入加减乘除符号时,
{//以下运算应该注意数据类型,尤其是大数字和浮点数及int数在运算中的区别
operator = comm;
s1 = jtf.getText();
double d3 = Double.parseDouble(s1);
double d4 = Double.parseDouble(ss);
BigDecimal bd3 = new BigDecimal(d3+"");
BigDecimal bd4 = new BigDecimal(d4+"");
if(operator.equals("+"))//加法时
{
d3 = bd3.add(bd4).doubleValue();
ss = d3+"";
jtf.setText(ss);
}else if(operator.equals("-"))//减法时
{
if(d4 == 0.0) {
ss=s1;
jtf.setText(ss);
}else{
d3=bd4.subtract(bd3).doubleValue();
ss=d3+"";
jtf.setText(ss);
}
}else if(operator.equals("*"))//乘法时
{
if(d4 == 0.0) {
ss=s1;
jtf.setText(ss);
}else
{
d3 = bd3.multiply(bd4).doubleValue();
ss = d3+"";
jtf.setText(ss);
}
}else if(operator.equals("/"))//除法时
{
if(d4 == 0.0)
{
ss = s1;
jtf.setText(s1);
}else
{
d3 = bd4.divide(bd3, 15, BigDecimal.ROUND_HALF_UP).doubleValue();
}
ss = d3+"";
jtf.setText(ss);
}
append = false;//不继续追加
}else if(comm.equals("="))//输入等号时,计算加减乘除的结果
{
String s2 = jtf.getText();
double d1 = Double.parseDouble(ss);
double d2 = Double.parseDouble(s2);
BigDecimal bd1 = new BigDecimal(d1+"");
BigDecimal bd2 = new BigDecimal(d2+"");
if(operator.equals("+"))
{
d1 = bd1.add(bd2).doubleValue();
}else if(operator.equals("-"))
{
d1 = bd1.subtract(bd2).doubleValue();
}else if(operator.equals("*"))
{
d1 = bd1.multiply(bd2).doubleValue();
}else if(operator.equals("/"))//精确计算浮点除法
{
if(d2!=0.0)
{
d1 = bd1.divide(bd2, 15, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
ss = "0";
jtf.setText(d1+"");
append = false;//不继续追加
}else if(comm.equals("+-*/"))//改变数值的正负号
{
String temp = jtf.getText();
if(!append)
{
jtf.setText("-");
append = true;
}else if(temp.startsWith("-"))//如果字符串以负号开头
{
jtf.setText(temp.substring(1));
}else
{
jtf.setText("-"+temp);
}
}
}
public void keyPressed(KeyEvent ke) {
} // 弹起事件
public void keyReleased(KeyEvent ke) {
// 从键盘读入数字
if (ke.getKeyChar() == '0') {
buttonArray[11].doClick(); }
if (ke.getKeyChar() == '1') {
buttonArray[4].doClick();
}
if (ke.getKeyChar() == '2') {
buttonArray[5].doClick();
}
if (ke.getKeyChar() == '3') {
buttonArray[6].doClick();
}
if (ke.getKeyChar() == '4') {
buttonArray[8].doClick();
}
if (ke.getKeyChar() == '5') {
buttonArray[9].doClick();
}
if (ke.getKeyChar() == '6') {
buttonArray[10].doClick();
}
if (ke.getKeyChar() == '7') {
buttonArray[12].doClick();
}
if (ke.getKeyChar() == '8') {
buttonArray[13].doClick();
}
if (ke.getKeyChar() == '9') {
buttonArray[14].doClick();
} /* 从键盘输入小数点
if (ke.getKeyChar() == '.')
bPoint.doClick();
*/
// 加法
if (ke.getKeyChar() == '+') {
buttonArray[0].doClick();
} // 减法
if (ke.getKeyChar() == '-') {
buttonArray[1].doClick();
} // 乘法
if (ke.getKeyChar() == '*') {
buttonArray[2].doClick();
} // 除法
if (ke.getKeyChar() == '/') {
buttonArray[3].doClick();
}
if (ke.getKeyChar() == '=') {
buttonArray[15].doClick();
}
if (ke.getKeyChar() == KeyEvent.VK_ENTER) {
buttonArray[15].doClick();
}
} public void keyTyped(KeyEvent ke) { }
//主方法
public static void main(String args[]) {
//创建名为Calculator的计算器对象
new Calculator("Calculator");
}
}