简单的计算器虽然简单,但对于初学入门者还是一次很好的实操训练,能帮助大家更快地掌握java图形用户界面编程的相关知识。虽然现实并没有几个人用java写图形界面 。或许是老师独门改造的题目,我一开始百度找到的用Java写一个简单的计算器(应该是浏览量最高的,好嫉妒呀)看似图形界面复杂丰富(主要原因是不符合我们老师的要求o(╥﹏╥)o),实则只用到了ActionListener
的监听器接口,以下小编的计算器分别设置了ActionListener、ItemListener
监听器接口,可以更加丰富全面地认识理解监听器接口的方法。
一、思路流程
问题1:如何获得外界输入端的信息?
经尝试(百度验证其它复杂计算器),发现编译出的程序框能自动感应到用户端输入的信息,所以只用保证原文本框为空,且设置好后来的运算函数
问题2:将JTextField获取的内容组合?
构造加减乘除函数,参数分别设置为text1.getText()、text2.getText()
问题3:等号之后的actionPerformed触发机制?
设置全局变量flag,根据不同flag的值,调用相应的运算函数
问题4:当除数为0时,进入哪个监听器?如何能监听到?
通过在除法运算的构造函数,对参数text2.getText()处理,当其为0时,flag=4,然后在ActionPerformed()函数进行处理。函数参数分别表示:对话框相对的中心位置,主体信息,标题,信息类型
JOptionPane.showMessageDialog(null, "除数不能为0", "系统提示", JOptionPane.ERROR_MESSAGE)
二、代码过程
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class J_SimpleComputer extends JFrame {
int flag = -1;
String output = "0";
JFrame f = new JFrame("简单的计算器");
Container c = f.getContentPane();
JTextField text1 = new JTextField("", 5);
JTextField text2 = new JTextField("", 5);
JTextField text3 = new JTextField("", 5);
//text3.setText("78");
JComboBox jcb = new JComboBox();
JButton b = new JButton("=");
String ope[] = { "+", "-", "*", "/" };
J_SimpleComputer() {
c.setLayout(new FlowLayout());
c.add(text1);
int i;
for (i = 0; i < 4; i++)
jcb.addItem(ope[i]);
//对JComboBox添加监听器
c.add(jcb);
c.add(text2);
jcb.addItemListener(new setOeration_Act());
//对JButton添加监听器
c.add(b);
c.add(text3);
b.addActionListener(new getOeration_Act());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 200);
f.setVisible(true);
}
public String add(String x, String y) {
int x1 = Integer.parseInt(x);
int y1 = Integer.parseInt(y);
output = String.valueOf(x1 + y1);
return output;
}
public String subtract(String x, String y) {
int x1 = Integer.parseInt(x);
int y1 = Integer.parseInt(y);
output = String.valueOf(x1 - y1);
return output;
}
public String multiply(String x, String y) {
int x1 = Integer.parseInt(x);
int y1 = Integer.parseInt(y);
output = String.valueOf(x1 * y1);
return output;
}
public String divide(String x, String y) {
int x1 = Integer.parseInt(x);
int y1 = Integer.parseInt(y);
if (y1 == 0)
flag = 4;
else
output = String.valueOf(x1 / y1);
return output;
}
class setOeration_Act implements ItemListener {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
// setText将对象确定为XXX字符串
if(e.getItem()=="+") flag = 0;
if(e.getItem()=="-") flag = 1;
if(e.getItem()=="*") flag = 2;
if(e.getItem()=="/") flag = 3;
System.out.println(flag);
}
}
}
class getOeration_Act implements ActionListener {
public void actionPerformed(ActionEvent e) {// 对话框相对的中心位置,主体信息,标题,信息类型
if(e.getActionCommand()=="=") {
if (flag == 0)
text3.setText(add(text1.getText(), text2.getText()));
if (flag == 1)
text3.setText(subtract(text1.getText(), text2.getText()));
if (flag == 2)
text3.setText(multiply(text1.getText(), text2.getText()));
if (flag == 3)
text3.setText(divide(text1.getText(), text2.getText()));
if (flag == 4)
JOptionPane.showMessageDialog(null, "除数不能为0", "系统提示", JOptionPane.ERROR_MESSAGE);
}
}
}
public static void main(String argv[]) {
new J_SimpleComputer();
}
}
三、执行结果
基本图形界面
乘法运算
除法运算
四、心得体会
以下文本是小编肺腑之言,包含debug时复杂的心理活动,希望对大家有所借鉴帮助
- 在理清上述代码的基本流程后,我写的两个监听机制迟迟没能生效,这让我抓狂了很久。我又仔细对照网上的运算数和运算符全由JButton写的复杂计算器代码如何用Java编写一个简单的计算器,对比actionPerformed(),感觉应该是
itemStateChanged()
监听器这段代码出了问题。通过验证,在该代码块里输出flag,发现一直是初始值而且每次监听到的都是两个重复结果。 - 接着开始认真查找ItemListener中的itemStateChanged(ItemEvent e)的使用方法,该方法的调用与itemState有关,item的状态有两个,Selected和deSelected,当改变下拉框中被选中的项时,其实是触发了两次事件,第一次时上次被选中的项由Selected改变为deSelected,第二次是本次被选中的项由deSelected改为Selected,所以itemStateChanged(ItemEvent e)事件中的代码要被执行两次。
- 解决方法很简单,就是
if(e.getStatChanged()==ItemEvent.SELECTED){//要执行的代码}
,简单修改后,又出现了其它一些小bug,不过很快就能成功运行了。
最后,终于可以开开心心地交作业啦啦啦(~ ̄▽ ̄)~