java课程设计-计算器
运行截图
所包含的类:
CalculatorFram包主函数的类,整合各个面板
package Calculator;
import javax.swing.*;
import java.awt.*;
public class CalculatorFram extends JFrame {
public CalculatorFram() {
super("计算器");
Toolkit kit = Toolkit.getDefaultToolkit();//绑定本地系统,用于查询本机的一些信息
Dimension screenSize = kit.getScreenSize();//获取屏幕分辨率,Dimension实例有wight和height属性,用来存组件的大小
setSize(screenSize.width/9*5,screenSize.height/5*3);//大小
setLocation(screenSize.width/4,screenSize.height/4);//位置
this.setBackground(new Color(248,248,248));
setLayout(new BorderLayout());
ImageIcon imageIcon=new ImageIcon(".\\tubiao.png");
this.setIconImage(imageIcon.getImage());
LogPanel logPanel = new LogPanel();
add(logPanel,BorderLayout.EAST);//新建log面板添加到主窗口
JPanel panel= new JPanel();
panel.setLayout(new BorderLayout());//新建panel面板
TextPanel textPanel = new TextPanel();
panel.add(textPanel, BorderLayout.NORTH);//新建结果显示窗口并添加到panel
CalculatePanel calculatePanel=new CalculatePanel(textPanel, logPanel);
panel.add(calculatePanel,BorderLayout.CENTER);//新建按钮面板并添加到panel面板
add(panel,BorderLayout.CENTER);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
CalculatorFram c = new CalculatorFram();
}
}
LogPanel存放历史记录面板
package Calculator;
import javax.swing.*;
import java.awt.*;
public class LogPanel extends JPanel {
JTextArea log;
StringBuffer logMessage = new StringBuffer("历史记录:\n\n");
GridBagLayout gridBag = new GridBagLayout();
GridBagConstraints gc = new GridBagConstraints();
JLabel label ;
public LogPanel() {
setLayout(gridBag);
gc.fill = GridBagConstraints.BOTH;
gc.weightx = 1.0;
gc.weighty = 1.0;
log = new JTextArea( 2, 23);
log.setBackground(new Color(243,243,243));
log.setBorder(null);
log.setText(logMessage.toString());
log.setSelectedTextColor(Color.RED);
log.setFont(new Font("黑体",Font.BOLD,15));
log.setEditable(false);
log.setLineWrap(true); //激活自动换行功能
log.setWrapStyleWord(true); //设置在单词过长的时候是否要把长单词移到下一行。
JScrollPane scroll = new JScrollPane(log);
scroll.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);//设置滚动条自动出现
scroll.setBackground(Color.BLUE);
scroll.setBorder(null); //添加滚动条的jtextarea设置无边框
scroll.setOpaque(true); //设置背景透明
gc.gridx=0;gc.gridy=1;
add(scroll,gc);
TextPanel text= new TextPanel();
}
}
TextPanel显示区面板
package Calculator;
import javax.swing.*;
import java.awt.*;
public class TextPanel extends JPanel {
JLabel hint = new JLabel(" ");
JLabel input = new JLabel(" ");
JLabel answer= new JLabel("0");
public TextPanel() {
setLayout(new BorderLayout());
this.setBackground(new Color(244,244,244));
answer.setHorizontalAlignment(JLabel.RIGHT);
hint.setHorizontalAlignment(JLabel.RIGHT);
input.setHorizontalAlignment(JLabel.RIGHT);//设置右对齐
answer.setFont(new Font("黑体",Font.BOLD, 35));
input.setFont(new Font("黑体",Font.PLAIN, 25));
hint.setFont(new Font("宋体",Font.BOLD, 25));
add(hint,BorderLayout.NORTH);
add(input,BorderLayout.CENTER);
add(answer,BorderLayout.SOUTH);
}
}
CalculatePanel包含按钮的外观和功能
package Calculator;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalculatePanel extends JPanel {
JButton b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;//数字按钮
JButton bAdd, bMinus, bMultiply, bDivide, bEqual;//加减乘除按钮
JButton CE, C, sqrt, pow, delete, reciprocal, point, left, right, B2, O8, H16;
TextPanel textPanel;
LogPanel logPanel;
StringBuffer expressions = new StringBuffer();//存储计算式的字符串
GridBagConstraints gc= new GridBagConstraints();
GridBagLayout gridBag = new GridBagLayout();
CommandAction command = new CommandAction();
OperationListener operation = new OperationListener();
public CalculatePanel(TextPanel tx, LogPanel log) {
this.textPanel = tx;//同步主窗口中的TextPanel面板
this.logPanel = log;//同步主窗口中的LogPanel面板
this.setBackground(new Color(247,247,247));
setLayout(gridBag);
gc.fill = GridBagConstraints.BOTH;
gc.weightx = 1.0;
gc.weighty = 1.0;
Color white = new Color(252,252,252);
Color gray = new Color(247,247,247);
gc.gridx=1;gc.gridy=6;
b0 = makeJButton("0",gc, command,white);
gc.gridx=0;gc.gridy=5;
b1 = makeJButton("1",gc, command,white);
gc.gridx=1;gc.gridy=5;
b2 = makeJButton("2",gc, command,white);
gc.gridx=2;gc.gridy=5;
b3 = makeJButton("3",gc, command,white);
gc.gridx=0;gc.gridy=4;
b4 = makeJButton("4",gc, command,white);
gc.gridx=1;gc.gridy=4;
b5 = makeJButton("5",gc,command,white);
gc.gridx=2;gc.gridy=4;
b6 = makeJButton("6",gc,command,white);
gc.gridx=0;gc.gridy=3;
b7 = makeJButton("7",gc,command,white);
gc.gridx=1;gc.gridy=3;
b8 = makeJButton("8",gc,command,white);
gc.gridx=2;gc.gridy=3;
b9 = makeJButton("9",gc,command,white);
gc.gridx=0;gc.gridy=6;
point = makeJButton(".",gc,command,white);
gc.gridx=2;gc.gridy=6;
bEqual = makeJButton("=",gc,operation,new Color(145,193,231));
gc.gridx=3;gc.gridy=3;
bDivide = makeJButton("/",gc,operation,gray);
gc.gridx=3;gc.gridy=4;
bMultiply = makeJButton("*",gc,operation,gray);
gc.gridx=3;gc.gridy=5;
bMinus = makeJButton("-",gc,operation,gray);
gc.gridx=3;gc.gridy=6;
bAdd = makeJButton("+",gc,operation,gray);
gc.gridx=1;gc.gridy=1;
CE = makeJButton("CE",gc,command,gray);
gc.gridx=2;gc.gridy=1;
C = makeJButton("C",gc,command,gray);
gc.gridx=3;gc.gridy=1;
delete = makeJButton("Delete",gc,command,gray);
gc.gridx=0;gc.gridy=1;
reciprocal = makeJButton("1/x",gc,command,gray);
gc.gridx=0;gc.gridy=2;
pow = makeJButton("x^2",gc,operation,gray);
gc.gridx=1;gc.gridy=2;
sqrt = makeJButton("√x",gc,operation,gray);
gc.gridx=2;gc.gridy=2;
left = makeJButton("(",gc,command,gray);
gc.gridx=3;gc.gridy=2;
right= makeJButton(")",gc,command,gray);
gc.gridx=0;gc.gridy=0;
B2= makeJButton("二进制",gc,operation,gray);
gc.gridx=1;gc.gridy=0;
O8= makeJButton("八进制",gc,operation,gray);
gc.gridx=2;gc.gridy=0;
H16= makeJButton("十六进制",gc,operation,gray);
}
JButton makeJButton(String name, GridBagConstraints gc, ActionListener listener, Color color){
//通过约束gc,创建按钮
JButton b=new JButton(name);
b.setFont(new Font("黑体",Font.BOLD,15));
b.setBackground(color);
gridBag.setConstraints(b, gc);
b.addActionListener(listener);
b.setBorderPainted(false);
add(b);
return b;
}
class CommandAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent actionEvent) {
String str=actionEvent.getActionCommand();
if(str=="0"){
expressions.append("0");
textPanel.input.setText(expressions.toString());
}
if(str=="1"){
expressions.append("1");
textPanel.input.setText(expressions.toString());
}
if(str=="2"){
expressions.append("2");
textPanel.input.setText(expressions.toString());
}
if(str=="3"){
expressions.append("3");
textPanel.input.setText(expressions.toString());
}
if(str=="4"){
expressions.append("4");
textPanel.input.setText(expressions.toString());
}
if(str=="5"){
expressions.append("5");
textPanel.input.setText(expressions.toString());
}
if(str=="6"){
expressions.append("6");
textPanel.input.setText(expressions.toString());
}
if(str=="7"){
expressions.append("7");
textPanel.input.setText(expressions.toString());
}
if(str=="8"){
expressions.append("8");
textPanel.input.setText(expressions.toString());
}
if(str=="9"){
expressions.append("9");
textPanel.input.setText(expressions.toString());
}
if(str=="("){
expressions.append("(");
textPanel.input.setText(expressions.toString());
}
if(str==")"){
expressions.append(")");
textPanel.input.setText(expressions.toString());
}
if(str=="."){
expressions.append(".");
textPanel.input.setText(expressions.toString());
}
if(str=="Delete"){
if(expressions.length()>0){
expressions.deleteCharAt(expressions.length()-1);
textPanel.input.setText(expressions.toString());
}
}
if(str=="1/x"){
expressions.insert(0,"1/(").toString();
expressions.append(")").toString();
textPanel.input.setText(expressions.toString());
}
if(str=="C"){//清空所有
textPanel.hint.setText(" ");
textPanel.answer.setText("0");
textPanel.input.setText(" ");
logPanel.logMessage = new StringBuffer("历史记录:\n\n");
expressions = new StringBuffer();
logPanel.log.setText(logPanel.logMessage.toString());
}
if(str=="CE"){
expressions = new StringBuffer();
textPanel.hint.setText(" ");
textPanel.answer.setText("0");
textPanel.input.setText(" ");
}
textPanel.hint.setText(" ");
}
}
class OperationListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent actionEvent) {
String str=actionEvent.getActionCommand();
if(str=="="){
try {
String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
textPanel.input.setText(expressions.append("=").toString());
textPanel.answer.setText(answer);
logPanel.logMessage.append(expressions+"\n"+answer+"\n\n");//同步历史记录
logPanel.log.setText(logPanel.logMessage.toString());
} catch (FormulaException e) {
textPanel.hint.setText(e.getMessage());
textPanel.answer.setText(" ");
}
expressions = new StringBuffer();//将expressions清空
}
if(str=="√x"){
try{
double a = Math.sqrt(new MathTool().calculate(expressions.toString()));
String answer = String.valueOf(a);
textPanel.input.setText(expressions.insert(0,"√(").toString());
textPanel.input.setText(expressions.append(")=").toString());
textPanel.answer.setText(answer);
logPanel.logMessage.append(expressions+"\n"+answer+"\n\n");//同步历史记录
logPanel.log.setText(logPanel.logMessage.toString());
} catch (FormulaException e) {
textPanel.hint.setText(e.getMessage());
textPanel.answer.setText(" ");
}
}
if(str=="x^2"){
try{
double a = Math.pow(new MathTool().calculate(expressions.toString()),2);
String answer = String.valueOf(a);
textPanel.input.setText(expressions.insert(0,"(").toString());
textPanel.input.setText(expressions.append(")^2=").toString());
textPanel.answer.setText(answer);
logPanel.logMessage.append(expressions+"\n"+answer+"\n\n");//同步历史记录
logPanel.log.setText(logPanel.logMessage.toString());
} catch (FormulaException e) {
textPanel.hint.setText(e.getMessage());
textPanel.answer.setText(" ");
}
}
if(str=="+"){
try{
String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
textPanel.answer.setText(answer);
}catch (FormulaException e) {
textPanel.hint.setText(e.getMessage());
textPanel.answer.setText(" ");
}
expressions.append("+");
textPanel.input.setText(expressions.toString());
}
if(str=="-"){
try{
String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
textPanel.answer.setText(answer);
}catch (FormulaException e) {
textPanel.hint.setText(e.getMessage());
textPanel.answer.setText(" ");
}
expressions.append("-");
textPanel.input.setText(expressions.toString());
}
if(str=="*"){
try{
String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
textPanel.answer.setText(answer);
}catch (FormulaException e) {
textPanel.hint.setText(e.getMessage());
textPanel.answer.setText(" ");
}
expressions.append("*");
textPanel.input.setText(expressions.toString());
}
if(str=="/"){
try{
String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
textPanel.answer.setText(answer);
}catch (FormulaException e) {
textPanel.hint.setText(e.getMessage());
textPanel.answer.setText(" ");
}
expressions.append("/");
textPanel.input.setText(expressions.toString());
}
if(str=="二进制"){
String answer=textPanel.input.getText();
boolean flag= true;
try{
int i = Integer.parseInt(textPanel.input.getText());
answer=Integer.toBinaryString(i);
}catch (Exception e){
flag = false;
}
if(flag){
logPanel.logMessage.append(expressions+"=\n"+answer+"\n\n");//同步历史记录
logPanel.log.setText(logPanel.logMessage.toString());
textPanel.answer.setText(answer);
}
else{
textPanel.hint.setText("目前只支持转换整数!");
textPanel.answer.setText("0");
}
}
if(str=="八进制"){
String answer=textPanel.input.getText();
boolean flag= true;
try{
int i = Integer.parseInt(textPanel.input.getText());
answer="o"+Integer.toOctalString(i);
}catch (Exception e){
flag = false;
}
if(flag){
logPanel.logMessage.append(expressions+"=\n"+answer+"\n\n");//同步历史记录
logPanel.log.setText(logPanel.logMessage.toString());
textPanel.answer.setText(answer);
}
else{
textPanel.hint.setText("目前只支持转换整数!");
textPanel.answer.setText("0");
}
}
if(str=="十六进制"){
String answer=textPanel.input.getText();
boolean flag= true;
try{
int i = Integer.parseInt(textPanel.input.getText());
answer="ox"+Integer.toHexString(i);
}catch (Exception e){
flag = false;
}
if(flag){
logPanel.logMessage.append(expressions+"=\n"+answer+"\n\n");//同步历史记录
logPanel.log.setText(logPanel.logMessage.toString());
textPanel.answer.setText(answer);
}
else{
textPanel.hint.setText("目前只支持转换整数!");
textPanel.answer.setText("0");
}
}
}
}
}
核心的算法实现是抄的,就放在下一篇吧!