使用 Java AWT 创建计算器
在本 Java 教程中,
我们将学习如何使用 Java AWT 构建一个简单的计算器。这个计算器具有一些简单的功能,例如所有基本的数学运算和一些特殊的附加功能,我们将在后面看到。
让我们开始吧。
首先,对AWT进行简要描述
。AWT (抽象窗口工具包)是一种 API,可帮助构建基于 GUI (图形用户界面)的 Java 应用程序。GUI
它使用一些图形帮助用户进行交互。它主要由一组创建和管理 GUI 所需的类和方法组成,以简化的方式,例如,,,,我buttons
已经 提供了用于事件处理的计算器的Java 代码。 是的,它不是小程序代码,小程序代码已被弃用。windows
frame
textfield
RadioButton
etc
Action listener interface
import java.awt.*;
import java.awt.event.*;
class MyCalc extends WindowAdapter implements ActionListener{
Frame f;
Label l1;
Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;
Button badd,bsub,bmult,bdiv,bmod,bcalc,bclr,bpts,bneg,bback;
double xd;
double num1,num2,check;
MyCalc(){
f= new Frame("MY CALCULATOR");
// INSTANTIATING COMPONENETS
l1=new Label();
l1.setBackground(Color.LIGHT_GRAY);
l1.setBounds(50,50,260,60);
b1=new Button("1");
b1.setBounds(50,340,50,50);
b2=new Button("2");
b2.setBounds(120,340,50,50);
b3=new Button("3");
b3.setBounds(190,340,50,50);
b4=new Button("4");
b4.setBounds(50,270,50,50);
b5=new Button("5");
b5.setBounds(120,270,50,50);
b6=new Button("6");
b6.setBounds(190,270,50,50);
b7=new Button("7");
b7.setBounds(50,200,50,50);
b8=new Button("8");
b8.setBounds(120,200,50,50);
b9=new Button("9");
b9.setBounds(190,200,50,50);
b0=new Button("0");
b0.setBounds(120,410,50,50);
bneg=new Button("+/-");
bneg.setBounds(50,410,50,50);
bpts=new Button(".");
bpts.setBounds(190,410,50,50);
bback=new Button("back");
bback.setBounds(120,130,50,50);
badd=new Button("+");
badd.setBounds(260,340,50,50);
bsub=new Button("-");
bsub.setBounds(260,270,50,50);
bmult=new Button("*");
bmult.setBounds(260,200,50,50);
bdiv=new Button("/");
bdiv.setBounds(260,130,50,50);
bmod=new Button("%");
bmod.setBounds(190,130,50,50);
bcalc=new Button("=");
bcalc.setBounds(245,410,65,50);
bclr=new Button("CE");
bclr.setBounds(50,130,65,50);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
b9.addActionListener(this);
b0.addActionListener(this);
bpts.addActionListener(this);
bneg.addActionListener(this);
bback.addActionListener(this);
badd.addActionListener(this);
bsub.addActionListener(this);
bmult.addActionListener(this);
bdiv.addActionListener(this);
bmod.addActionListener(this);
bcalc.addActionListener(this);
bclr.addActionListener(this);
f.addWindowListener(this);
//ADDING TO FRAME
f.add(l1);
f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5);f.add(b6); f.add(b7); f.add(b8);f.add(b9);f.add(b0);
f.add(badd); f.add(bsub); f.add(bmod); f.add(bmult); f.add(bdiv); f.add(bmod);f.add(bcalc);
f.add(bclr); f.add(bpts);f.add(bneg); f.add(bback);
f.setSize(360,500);
f.setLayout(null);
f.setVisible(true);
}
//FOR CLOSING THE WINDOW
public void windowClosing(WindowEvent e) {
f.dispose();
}
public void actionPerformed(ActionEvent e){
String z,zt;
//NUMBER BUTTON
if(e.getSource()==b1){
zt=l1.getText();
z=zt+"1";
l1.setText(z);
}
if(e.getSource()==b2){
zt=l1.getText();
z=zt+"2";
l1.setText(z);
}
if(e.getSource()==b3){
zt=l1.getText();
z=zt+"3";
l1.setText(z);
}
if(e.getSource()==b4){
zt=l1.getText();
z=zt+"4";
l1.setText(z);
}
if(e.getSource()==b5){
zt=l1.getText();
z=zt+"5";
l1.setText(z);
}
if(e.getSource()==b6){
zt=l1.getText();
z=zt+"6";
l1.setText(z);
}
if(e.getSource()==b7){
zt=l1.getText();
z=zt+"7";
l1.setText(z);
}
if(e.getSource()==b8){
zt=l1.getText();
z=zt+"8";
l1.setText(z);
}
if(e.getSource()==b9){
zt=l1.getText();
z=zt+"9";
l1.setText(z);
}
if(e.getSource()==b0){
zt=l1.getText();
z=zt+"0";
l1.setText(z);
}
if(e.getSource()==bpts){ //ADD DECIMAL PTS
zt=l1.getText();
z=zt+".";
l1.setText(z);
}
if(e.getSource()==bneg){ //FOR NEGATIVE
zt=l1.getText();
z="-"+zt;
l1.setText(z);
}
if(e.getSource()==bback){ // FOR BACKSPACE
zt=l1.getText();
try{
z=zt.substring(0, zt.length()-1);
}catch(StringIndexOutOfBoundsException f){return;}
l1.setText(z);
}
//AIRTHMETIC BUTTON
if(e.getSource()==badd){ //FOR ADDITION
try{
num1=Double.parseDouble(l1.getText());
}catch(NumberFormatException f){
l1.setText("Invalid Format");
return;
}
z="";
l1.setText(z);
check=1;
}
if(e.getSource()==bsub){ //FOR SUBTRACTION
try{
num1=Double.parseDouble(l1.getText());
}catch(NumberFormatException f){
l1.setText("Invalid Format");
return;
}
z="";
l1.setText(z);
check=2;
}
if(e.getSource()==bmult){ //FOR MULTIPLICATION
try{
num1=Double.parseDouble(l1.getText());
}catch(NumberFormatException f){
l1.setText("Invalid Format");
return;
}
z="";
l1.setText(z);
check=3;
}
if(e.getSource()==bdiv){ //FOR DIVISION
try{
num1=Double.parseDouble(l1.getText());
}catch(NumberFormatException f){
l1.setText("Invalid Format");
return;
}
z="";
l1.setText(z);
check=4;
}
if(e.getSource()==bmod){ //FOR MOD/REMAINDER
try{
num1=Double.parseDouble(l1.getText());
}catch(NumberFormatException f){
l1.setText("Invalid Format");
return;
}
z="";
l1.setText(z);
check=5;
}
//RESULT BUTTON
if(e.getSource()==bcalc){
try{
num2=Double.parseDouble(l1.getText());
}catch(Exception f){
l1.setText("ENTER NUMBER FIRST ");
return;
}
if(check==1)
xd =num1+num2;
if(check==2)
xd =num1-num2;
if(check==3)
xd =num1*num2;
if(check==4)
xd =num1/num2;
if(check==5)
xd =num1%num2;
l1.setText(String.valueOf(xd));
}
//FOR CLEARING THE LABEL and Memory
if(e.getSource()==bclr){
num1=0;
num2=0;
check=0;
xd=0;
z="";
l1.setText(z);
}
}
//MAIN METHOD where objects of MyCalc is instantaiated
public static void main(String args[]){
new MyCalc();
}
}
所以我所做的只是ActionListener
在我们的类中实现接口MyCalc
,并在其构造函数中将AWT组件注册到监听器中,并使用actionPerformed
方法完成事件处理。
我们所有的逻辑部分都写在这个actionPerformed
函数中,我们将在下面看到:
逻辑部分
1.对于数字按钮
if(e.getSource()==b1){ //b1 for number 1
zt=l1.getText();
z=zt+"1";// 1 will merged at the end of the previous value
l1.setText(z);
}
当按下任何数字按钮时,
标签中的任何值l1
都将存储在一个变量中zt
,然后与相应的数字连接,然后显示在l1
NEGATIVE 和 DECIMAL PTS 按钮的标签中,我们做了类似的操作
2.用于气密性按钮
if(e.getSource()==badd){ //FOR ADDITION
num1=Double.parseDouble(l1.getText());
z="";
l1.setText(z);
check=1; // 1 for the adddition
}
现在我们将标签的值转换为双精度类型后存储l1
到一个变量中num1
,从技术上讲,这将是第一个数字
,然后将标签设置l1
为null
我们将使用一个check
变量来获取这个特定的空中按钮(此处)被点击的信息,这样我们就可以在按钮+
中执行此操作=
3.等于按钮
if(e.getSource()==bcalc){
num2=Double.parseDouble(l1.getText());
if(check==1)
xd =num1+num2;
if(check==2)
xd =num1-num2;
if(check==3)
xd =num1*num2;
if(check==4)
xd =num1/num2;
if(check==5)
xd =num1%num2;
l1.setText(String.valueOf(xd));
}
现在再次将值存储到变量中,该变量在技术上将是l1
第二个数字 ,然后检查变量的值,然后执行相应的操作,然后在标签中显示结果num2
check
l1
4.清除按钮
if(e.getSource()==bclr){
num1=0;
num2=0;
check=0;
xd=0;
z="";
l1.setText(z);
}
这里将我们使用的所有变量更新为其默认值0
,并将标签设置l1
为,null
以便我们随后可以开始新的计算
5.退格键
if(e.getSource()==bback){ // FOR BACKSPACE
zt=l1.getText();
try{
z=zt.substring(0, zt.length()-1);
}catch(StringIndexOutOfBoundsException f){return;}
l1.setText(z);
}
这里只是通过使用函数l1
删除最后一位数字来更新值 ,并处理当值为空且仍然按下按钮时发生的事件substring
StringIndexOutOfBoundsException
label
back
6.特殊附加功能
我所做的只是处理了EQUAL和所有AIRTHMETIC按钮中的一个异常,并根据AIRTHMETIC BUTTONS
内部的情况打印了所需的消息:
try{
num1=Double.parseDouble(l1.getText());
}catch(NumberFormatException f){
l1.setText("Invalid Format");
return;
}
里面的“等于”按钮:
try{
num2=Double.parseDouble(l1.getText());
}catch(Exception f){
l1.setText("ENTER NUMBER FIRST ");
return;
}
当我们将值转换为双精度值时,但是假设标签l1
有null
值(即标签为空)并且我们仍然按下这些按钮,那么它将生成NumberFormatException
异常,
因此处理它并打印所需的消息
例如:
如果我单击1
然后+
我单击-
而不是其他数字按钮,因此这是一种无效格式,并且-
当时单击label
时null
因此生成了异常所以只需处理它并invalid format
打印label
类似地,当label
在这种情况下被点击null
时,将显示在里面=
ENTER NUMBER FIRST
label
至此,本期 Java AWT 教程就结束了。
现在就浏览代码并尝试一下吧。如果您在理解或使用代码时遇到任何困难,请在下方评论区留言。
如果您想下载并运行我的代码CALC
,可以在这里
找到 ,我已经上传了源代码和可执行 jar 文件。