Java实现图形用户界面的简易计算器

    刚学完JavaSE,于是就自己用Java编写了一个GUI的简易计算器小程序。希望能够帮助大家
本程序主要用到了Java中的awt和swing包下的各种组件完成图形界面的设计,通过内部类的形式实现数据的运算操作,初步的只定义加减乘除四种运算,读者可以根据自己的需求按照本文的例子可以自己添加其他的运算。同时为了方便运算本程序中还添加了一个清零的按钮,用于清空显示区中的数据内容。

首先定义CalculatorPanel类用于实现计算器的整体界面,该类继承自JPanel类。同时在该类中,定义了两个内部类NumberAction和NumberAction来实现数字监听器和运算监听器。他们都被private修饰,这样的好处就是外部不能随意创建对象来访问数据运算的过程,也就是可以按保证该程序运算过程的安全性。刚开始小风是单独定义两个类来分别实现数据的监听和运算监听。但是一旦他们被私有化了就不能直接被 CalculatorPanel类访问了,后来就想到了内部类,于是直接将他们定义成了内部类,并且用private修饰,既保证了运算的安全性有保证了数据的正常访问。
代码如下:
public class CalculatorPanel extends JPanel
{
private JPanel jp;//中间的面板
private double result;//计算结果
 private boolean start;//用于判断是否是首次输入
 private boolean flag;//用于判断是否清空显示区的值
 private String lastCommand;//用于保存运算符
 JButton display;//显示区域
/**
构造方法:
*/
 public CalculatorPanel()
 {
  //初始化个项值
  result = 0;
  start = true;
  flag = false;
  lastCommand = "=";
  
  //设置CalculatorPanel面板的布局为框架布局
  setLayout(new BorderLayout());
  
  //这个按钮用来显示值的区域
  display = new JButton("0.0");
  display.setEnabled(false);//按钮样式设置为禁用样式
  
  //用来初始化,清除用的
  JButton clear = new JButton("清零");
  clear.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent e) {
    // 初始化的操作
    result = 0;
    start = true;
    flag = false;
    lastCommand = "=";
    display.setText("0.0");
   }
  });
  
  jp = new JPanel();
  //将面板设置为网格布局,4行4列
  jp.setLayout(new GridLayout(4, 4));
  
  //实例化监听对象
  NumberAction na = new NumberAction();
  CommandAction ca = new CommandAction();
  
  makeButton("7",na);
  makeButton("8",na);
  makeButton("9",na);
  makeButton("/",ca);
  
  makeButton("4",na);
  makeButton("5",na);
  makeButton("6",na);
  makeButton("*",ca);
  
  makeButton("1",na);
  makeButton("2",na);
  makeButton("3",na);
  makeButton("-",ca);
  
  makeButton("0",na);
  makeButton(".",na);
  makeButton("+",ca);
  makeButton("=",ca);
  
  //将面板和两个按键加入到主界面,实现计算器的界面
  add(display,BorderLayout.NORTH);
  add(jp,BorderLayout.CENTER);
  add(clear,BorderLayout.SOUTH);
  
 }
 
 private void makeButton(String buttonName,ActionListener al)
 {
  JButton jb = new JButton(buttonName);
  jp.add(jb);
  jb.addActionListener(al);
  
 }
 
 //数字监听器
 private class NumberAction implements ActionListener{
  @Override
  public void actionPerformed(ActionEvent e) {
   // TODO Auto-generated method stub
   JButton jb = (JButton)e.getSource();//获取事件源对象
   String input = jb.getText();//获取事件源上的标签
   if(start)//首次输入
   {
    //一开始输入为".",就什么也不做
    if(input.equals("."))
    {
     return ;
    }
    
    //如果是"0.0", 就清空
    if(display.getText().equals("0.0"))
    {
     display.setText(" ");
    }
    
    start = false;//改变是否首次输入的标记值
   }
   else
   {
    //判断显示区域的值里是否已经有".", 如果有,输入的又是".",就什么也不做
    if(display.getText().indexOf(".")!=-1)
    {
     if(input.equals("."))
     {
      return ;
     }
    }
    //判断显示区域的值里只有"-",输入的又是".",就什么也不做
    if(display.getText().equals("-"))
    {
     if(input.equals("."))
     {
      return ;
     }
    }
    //判断显示区域的值如果是"0",输入的不是".",就什么也不做
    if(display.getText().equals("0"))
    {
     if(!input.equals("."))
     {
      return ;
     }
    }
   }
   //如果单击了运算符以后再输入数字的话,就要清空显示区域的值
   if(flag)
   {
    display.setText("");
    flag = false;//还原初始值,不需要清空
   }
   display.setText(display.getText()+input);//设置显示区域的值
  }
 }
 //运算符监听器
 public class CommandAction implements ActionListener
 {
  @Override
  public void actionPerformed(ActionEvent e ) {
   // TODO Auto-generated method stub
   JButton jb = (JButton)e.getSource();
   String inputCommand = jb.getText();
   
   if(start)
   {
    if(inputCommand.equals("-"))
    {
     display.setText("-");
     start = false;
    }
   }
   else
   {
    if(!flag)
    {
     calculate(Double.parseDouble(display.getText()));
    }
    lastCommand = inputCommand;
    flag = true;
   }
  }
 }
  private void calculate(double x) {
   // TODO Auto-generated method stub
   if(lastCommand.equals("+"))
   {
    result +=x;
   }
   else if(lastCommand.equals("-"))
   {
    result -=x;
   }
   else if(lastCommand.equals("*"))
   {
    result *=x;
   }
   else if(lastCommand.equals("/"))
   {
    result /=x;
   }
   else if(lastCommand.equals("="))
   {
    result =x;
   }
   display.setText(""+result);
  }
  
}

第二步:定义MyFrameUitl类对主题窗口的规格进行设置
代码如下:

public class MyFrameUitl {
 public static void init(JFrame jFrame,Dimension frameSize,String title,String iconFileName,boolean resizable)
 {
  // TODO Auto-generated method stub
  Toolkit tk = Toolkit.getDefaultToolkit();
  Dimension screenSize = tk.getScreenSize();
  //获取宽和高
  int screenWidth = screenSize.width;
  int screenHeight = screenSize.height;
  
  //找中心点
  int centerX = screenWidth/2;
  int centerY = screenHeight/2;
  
  int frameHeight = frameSize.height;
  int frameWidth = frameSize.width;
  //设置窗体位置
  jFrame.setBounds(centerX-frameWidth/2,centerY-frameHeight/2,frameWidth,frameHeight);
  //设置标题
  jFrame.setTitle(title);
  if(iconFileName!=null)
  {
   jFrame.setIconImage(tk.getImage(iconFileName));//设置图标
  }
  //设置皮肤外观为所使用的平台外观
  try
  {
   UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
   SwingUtilities.updateComponentTreeUI(jFrame);
   
  }
  catch(Exception el)
  {
   el.printStackTrace();
  }
  
  jFrame.setResizable(resizable);//设置窗体是否可以改变大小
  jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置程序关闭动作
  jFrame.setVisible(true);
 }
}

第三步:创建 CalculatorFrame类继承自JFrame类,在该类的构造方法中利用add方法添加第一步 CalculatorPanel类的对象
    由于本程序中该对象只用一次,因此采用匿名对象的方式实现。
public class CalculatorFrame extends JFrame{
 public CalculatorFrame() {
  add(new CalculatorPanel());
  MyFrameUitl.init(this,new Dimension(400,300),"简易计算器",null,true);
  this.pack();
 }
}
最后一步:创建 CalculatorTest类,这里就不用多说了吧,好了,剩下的大家应该懂懂的。

public class CalculatorTest {
 public static void main(String[] args) {
  new CalculatorFrame();
 }
}

猜你喜欢

转载自blog.csdn.net/qq_38701478/article/details/79472955