实现了一个最简单的计算机GUI,和JAVA核心技术写的还是有点不一样的...
package myswing;
import javax.swing.*;
import javax.swing.text.Document;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by baidu on 15/12/30.
*/
public class CalculatorTest {
public static void main(String [] argc) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
CalculatorFrame mC = new CalculatorFrame();
mC.setTitle("Calculator");
mC.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mC.setVisible(true);
}
});
}
}
class CalculatorFrame extends JFrame {
private JPanel mPanelKey = new JPanel();
private JButton mButtonShow = new JButton();
private String mNumShow = new String();
private boolean mStart = true;
private class NumListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent _event) {
//Show Num
if(mStart) {
mNumShow = mNum;
mButtonShow.setText(mNumShow);
mStart = false;
} else {
mNumShow += mNum;
mButtonShow.setText(mNumShow);
}
}
public NumListener(String _Num) {
mNum = _Num;
}
String mNum = null;
}
private class OperatorListener implements ActionListener {
public OperatorListener(String _oper) {
mOper = _oper;
}
@Override
public void actionPerformed(ActionEvent _event) {
if(mStart) {
return ;
}
if(!mStart && mNumShow != null)
{
if(!mOper.equals("=")) {
mButtonShow.setText(""); //清空数据框
Calculate.getInstance().SetOperAndNum(mOper, mNumShow);
}
else{ // =
//传入数值
Calculate.getInstance().SetOperAndNum(mOper, mNumShow);
//进行操作
mButtonShow.setText(
Double.toString(Calculate.getInstance().getResult())
);
Calculate.getInstance().ClearOper();
}
mStart = true;
}
}
String mOper = null;
}
private void addButton(String _strName) {
JButton mJButton = new JButton(_strName);
mPanelKey.add(mJButton);
//正则表达式, 来调用不同的listener
Pattern mPatter = Pattern.compile("[0-9.]");
Matcher mMatcher = mPatter.matcher(_strName);
ActionListener mAction = null;
if(mMatcher.find())
mAction = new NumListener(_strName);
else
mAction = new OperatorListener(_strName);
mJButton.addActionListener(mAction);
}
private void addViewContent() {
mButtonShow.setEnabled(false);
add(mButtonShow, BorderLayout.NORTH);
}
private void panelAddButton() {
addButton("7");
addButton("8");
addButton("9");
addButton("/");
addButton("4");
addButton("5");
addButton("6");
addButton("*");
addButton("1");
addButton("2");
addButton("3");
addButton("-");
addButton("0");
addButton(".");
addButton("=");
addButton("+");
}
public CalculatorFrame() {
setLayout(new BorderLayout());
mPanelKey.setLayout(new GridLayout(4, 4));
add(mPanelKey, BorderLayout.SOUTH);
panelAddButton();
addViewContent();
pack();
}
}
class Calculate {
private String mOper = null;
private double mBeforeNum = 0;
private Double mDoubleRes = null;
static private Calculate mCal = null;
static public Calculate getInstance() {
if(mCal == null)
mCal = new Calculate();
return mCal;
}
private void CalculateOper(String _Num) {
if(mOper == null)
return;
switch(mOper) {
case "+" :
mBeforeNum += Double.parseDouble(_Num);
break;
case "-" :
mBeforeNum -= Double.parseDouble(_Num);
break;
case "*" :
mBeforeNum *= Double.parseDouble(_Num);
break;
case "/" :
if(mBeforeNum == 0.0 || mBeforeNum == 0)
return;
mBeforeNum /= Double.parseDouble(_Num);
break;
}
}
public double getResult() {
return mBeforeNum;
}
public void SetOperAndNum(String _oper, String _Num) {
if(_oper == null)
return;
if(_oper.equals("+") || _oper.equals("-") || _oper.equals("*") || _oper.equals("/")) {
if(mOper == null) {
mOper = _oper;
mBeforeNum = Double.parseDouble(_Num);
}
else {
CalculateOper(_Num);
mOper = _oper;
}
}
else if(_oper.equals("=")) {
CalculateOper(_Num);
}
}
public void ClearOper() {
mOper = null;
}
}