package com;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.util.EventListener;
import java.awt.event.ActionEvent;
public class viewx extends JFrame {
public JTextField textField1;
public JTextField resulttext;
public JTextField textField;
public JTextField textField2;
public JTextArea textArea;
public viewx(){
init();
}
public void init() {
setTitle("计算器");
setResizable(false);
setBounds(100,100,600,280);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel viewPanel=new JPanel();
JPanel panel=new JPanel();
getContentPane().add(panel,BorderLayout.WEST);
final BorderLayout border=new BorderLayout();
border.setVgap(10);
border.setHgap(10);
panel.setLayout(border);
panel.add(viewPanel,BorderLayout.NORTH);
JTextField textField=new JTextField();
textField.setEditable(true);
textField.setHorizontalAlignment(SwingConstants.CENTER);
textField.setColumns(12);
JTextField textField1=new JTextField();
textField1.setHorizontalAlignment(SwingConstants.CENTER);
textField1.setColumns(5);
textField1.setEditable(true);
JTextField textField2=new JTextField();
textField2.setHorizontalAlignment(SwingConstants.CENTER);
textField2.setColumns(12);
textField2.setEditable(true);
viewPanel.add(textField);
viewPanel.add(textField1);
viewPanel.add(textField2);
final JPanel buttonPanel=new JPanel();
final GridLayout gridLayout=new GridLayout(4,0);
gridLayout.setHgap(10);
gridLayout.setVgap(10);
buttonPanel.setLayout(gridLayout);
panel.add(buttonPanel,BorderLayout.CENTER);
```java
String[][]names= {{"1","2","3","/","c"},{"4","5","6","*","退格"},{"7","8","9","-","sqrt"},{"0","+/-",".","+","="}};
JButton[][]buttons=new JButton[4][5];
for(int row=0;row<names.length;row++) {
for(int col=0;col<names.length+1;col++) {
buttons[row][col]=new JButton(names[row][col]);
buttonPanel.add(buttons[row][col]);
}
}
for(int row=0;row<names.length;row++) {
for(int col=0;col<names.length+1;col++) {
buttons[row][col].addActionListener(new CalculatorController());
}
}
final JLabel leftLabel=new JLabel();
leftLabel.setPreferredSize(new Dimension(10,0));
panel.add(leftLabel,BorderLayout.WEST);
final JLabel rightLabel=new JLabel();
rightLabel.setPreferredSize(new Dimension(10,0));
panel.add(rightLabel,BorderLayout.EAST);
final JPanel panelx=new JPanel();
getContentPane().add(panelx,BorderLayout.CENTER);
final JPanel viewPanel1=new JPanel();
panelx.add(viewPanel1,BorderLayout.NORTH);
JTextField resulttext=new JTextField();
resulttext.setEditable(false);
resulttext.setHorizontalAlignment(SwingConstants.CENTER);
resulttext.setColumns(18);
viewPanel1.add(resulttext);
JTextArea textArea=new JTextArea();
textArea.setColumns(15);
textArea.setRows(9);
textArea.setLineWrap(true);
final JScrollPane scrollPane=new JScrollPane();
scrollPane.setViewportView(textArea);
panelx.add(scrollPane,BorderLayout.CENTER);
final JPanel buttonPanel1=new JPanel();
panelx.add(buttonPanel1,BorderLayout.SOUTH);
final JButton aButton=new JButton();
aButton.setText("保存");
aButton.addActionListener(new Calculate());
buttonPanel1.add(aButton);
final JButton bButton=new JButton();
bButton.setText("查看");
bButton.addActionListener(new Calculate());
buttonPanel1.add(bButton);
final JButton cButton=new JButton();
cButton.setText("清除");
cButton.addActionListener(new Calculate());
buttonPanel1.add(cButton);
}
class Calculate implements ActionListener{
public void actionPerformed(ActionEvent e) {
JButton button=(JButton)e.getSource();
String clickStr = e.getActionCommand();
if(clickStr.equals("清除")) { //点击“清除”按键*******
textArea.setText("");
}else if(clickStr.equals("保存")){ //点击“保存”**********
String s=textArea.getText();
try {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Calculator\\result.txt"));
osw.write(s);
osw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}else if(clickStr.equals("查看")){ //点击“查看”*********
char[] chs = new char[2048];
try {
InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\Calculator\\result.txt"));
int len;
while ((len = isr.read(chs))!=-1){
textArea.append(String.valueOf(chs));
}
isr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
}
CalculateController:
package com;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Objects;
import javax.swing.JButton;
public class CalculatorController extends CalculatorModel implements ActionListener{
CalculatorModel model=new CalculatorModel();
viewx view=new viewx();
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
String buttonName = e.getActionCommand();
if (buttonName.equals("=")) {
String data = view.textArea.getText();
view.textArea.setText(data + view.textField.getText() + view.textField1.getText() + view.textField2.getText() + "=" + view.resulttext.getText() + "\n");
}
if ("0123456789.".contains(buttonName)) {//统一判断当输入了数字时,调用模型的相关方法//
if (view.textField1.getText().equals(""))
model.pressNumber1(buttonName);
else
model.pressNumber2(buttonName);
}
if (buttonName.equals("退格")) {
if (view.textField2.getText().equals(""))
model.pressBackspace1();
else model.pressBackspace2();
} else if (buttonName.equals("C"))
model.pressC();
if (buttonName.equals("sqrt") || buttonName.equals("+/-"))//按下按钮形成对计算器的相关运算//
model.singleOperator(buttonName);
else if (buttonName.equals("+"))
view.textField1.setText("+");
else if (buttonName.equals("-"))
view.textField1.setText("-");
else if (buttonName.equals("*"))
view.textField1.setText("*");
else if (buttonName.equals("/"))
view.textField1.setText("/");
model.calculate();
}
}
CalculateModel:
package com;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.JButton;
public class CalculatorModel extends viewx{
public double num=0.0;
public String operator="+";
public boolean f=true;//判断用户是否按下了按钮//
public boolean flag=true;//判断文本框内输入数字的正负//
public double calculate() {
if(textField1.equals("+"))
num=getNumberFromText1()+getNumberFromText2();
else if(textField1.equals("-"))
num=getNumberFromText1()-getNumberFromText2();
else if(textField1.equals("*"))
num=getNumberFromText1()*getNumberFromText2();
else if(textField1.equals("/")) {
if(getNumberFromText2()==0.0) {
flag=false;
resulttext.setText("除数不能为0");
}else num=getNumberFromText1()/getNumberFromText2();
}
return num;
}
public double getNumberFromText1() {
// TODO Auto-generated method stub
double result=0;
try {
result=Double.parseDouble(textField.getText());
}catch(NumberFormatException ignored) {
}
return result;
}
public double getNumberFromText2() {
// TODO Auto-generated method stub
double result=0;
try {
result=Double.parseDouble(textField2.getText());
}catch(NumberFormatException ignored) {
}
return result;
}
public void pressNumber1(String names) {//按位输入第一个文本框的数字//
if(f) {
textField.setText(names);
}else if(names.equals(".")&&(!textField.getText().contains("."))) {
textField.setText(textField.getText()+".");
}else if(!names.equals(".")) {
textField.setText(textField.getText()+names);
}
f=false;
}
public void pressNumber2(String names) {//按位输入第二个文本框的数字//
if(f) {
textField2.setText(names);
}else if(names.equals(".")&&(!textField2.getText().contains("."))) {
textField2.setText(textField2.getText()+".");
}else if(!names.equals(".")) {
textField2.setText(textField2.getText()+names);
}
f=false;
}
public void pressBackspace1() {//处理当按下C键时,第一个文本框输入的数字回退一位//
String text=textField.getText();
int i=text.length();
if(i>0) {
text=text.substring(0, i-1);
if(text.length()==0) {
textField.setText("");
f=true;
operator="=";
}else textField.setText(text);
}
}
public void pressBackspace2() {//处理当按下C键时,第二个文本框输入的数字回退一位//
String text=textField2.getText();
int i=text.length();
if(i>0) {
text=text.substring(0, i-1);
if(text.length()==0) {
textField2.setText("");
f=true;
operator="=";
}else textField.setText(text);
}
}
public void pressC() {
textField.setText("");
textField1.setText("");
textField2.setText("");
resulttext.setText("");
operator="=";
}
public void singleOperator(String names) {//处理只需要输入一个文本框的数字时的按钮方法//
operator=names;
switch(operator) {
case"sqrt":
if(num<0) {
flag=false;
resulttext.setText("根号内不能为负数");
}else {
textField1.setText("sqrt");
num=Math.sqrt(getNumberFromText1());
}
break;
case"+/-":
textField1.setText("+/-");
num=getNumberFromText1()*(-1);
if(flag) {
}
f=true;
flag=true;
break;
}
}
public void omitDecimal(double num) {
long t1;
double t2;
t1=(long)num;
t2=num-t1;
if(t2==0) {
resulttext.setText(String.valueOf(t1));
}else resulttext.setText(String.valueOf(new DecimalFormat("0.0000000").format(num)));
}
}
```java
把报错信息展示一下