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;//显示区域
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{
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
{
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;
}
}
}
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);
}
}
// 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);
}
{
// 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();
}
}
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();
}
}
public static void main(String[] args) {
new CalculatorFrame();
}
}