提交 0b8e1ce3 编写于 作者: Richard Du's avatar Richard Du

更新Listener.java, Main.java, Calculator.java, ResizingLabel.java, SqStackClass.java, Window.java

上级
package com.doreation.Calculator;
import static java.lang.Double.parseDouble;
public class Calculator {
private String text;
private double result = 0;
private int startBracket = -1;
private int endBracket = -1;
SqStackClass<Double> stNum = new SqStackClass<>();//数字栈
SqStackClass<Character> stOpr = new SqStackClass<>();//运算符栈
public Calculator(String text){
this.text = text.replaceAll(" ","")
.replaceAll("(","(")
.replaceAll(")",")")
.replaceAll("×","*")
.replaceAll("÷","/");
calculate();
}
public void calculate(){
boolean isMinus = false;
StringBuilder s1 = new StringBuilder();
for(int i=0; i<getText().length(); i++){
if(getEndBracket()==-1 && (int)judgeOpr(getText().charAt(i)) == 1){//如果是运算符且没有在append括号
if(!s1.isEmpty()){
stNum.push(parseDouble(String.valueOf(s1)));
s1.delete(0,s1.length());
}
if(!stOpr.empty() && (judgeOpr(stOpr.peek())==1.3)){//如果栈顶元素是乘除
stNum.push(calculator(stNum.pop(),stNum.pop(),stOpr.pop()));
}
if (getText().charAt(i)=='-') {
//isMinus = true;
s1.append(getText().charAt(i));
}
if(judgeOpr(getText().charAt(i))==1.3){ //如果当前是乘除符
stOpr.push(getText().charAt(i));
}
}else if (!s1.equals("") || getText().charAt(i)=='('){
if(getText().charAt(i)=='(' && getEndBracket() ==-1){//如果匹配到第一个左括号
findBrackets(i);//查找与当前左括号对应的右括号
if (i>0 && getText().charAt(i - 1) == '-') isMinus = true;
else isMinus = false;
}
s1.append(getText().charAt(i));
if(i==getEndBracket()){//匹配到最后一个')'
//s1.deleteCharAt(0).deleteCharAt(s1.length()-1);
s1.replace(0,s1.length(), String.valueOf(new Calculator(String.valueOf(modifyExpression(isMinus,s1))).getResult()));
setStartBracket(-1);
setEndBracket(-1);
isMinus = false;
}
//如果碰到左括号,从左括号到右括号截取字符串,递归调用,push进栈
}else{
s1.append(text.charAt(i));
}
}
if(!s1.equals("")){
stNum.push(parseDouble(String.valueOf(s1)));
}
if(!stOpr.empty() && (judgeOpr(stOpr.peek())==1.3)){//如果栈顶元素是乘除
stNum.push(calculator(stNum.pop(),stNum.pop(),stOpr.pop()));
}
while (!stNum.empty()){
setResult(result += stNum.pop());
}
}
public double calculator(double before, double after, char operator){
double result = 0;
switch(operator){
case '*' : result = before * after;break;
case '/' : result = after / before;break;
case '+' : result = before + after;break;
case '-' : result = before - after;break;
}
return result;
}
public double judgeOpr(char c){
char[] opr = {'+','-','*','/'};
double i = 0;
if(c==opr[0] || c==opr[1])
i = 1.2;
if(c==opr[2] || c==opr[3])
i = 1.3;
return i;
}
public void findBrackets(int start){
int n=0;
int j=0;
for(int i = start; i<getText().length(); i++){
if(n==0 && getText().charAt(i)=='('){
n++;
setStartBracket(i);
}else if (n!=0 && getText().charAt(i)=='('){
j++;
} else if (n!=0 && j==1 && getText().charAt(i)==')') {
j=0;
continue;
}
if (j==0 && getText().charAt(i)==')') {
setEndBracket(i);
break;
}
}
}
public StringBuilder modifyExpression(boolean hasMinus,StringBuilder s1){
StringBuilder s = new StringBuilder(s1);
//3-(2-1)
//String s = String.valueOf(s1);
if (hasMinus){
boolean pause = false;
s.deleteCharAt(1).deleteCharAt(s.length()-1);
for(int i = 1; i < s.length(); i++){
//先删除第1个字符和最后一个字符
//碰到左括号pause=true,如果pause==true,continue
//碰到右括号pause=false
if (s.charAt(i)=='('){
pause=true;
}else if(s.charAt(i)==')'){
pause=false;
}
if (!pause) {
if(s.charAt(i)=='+'){
s.replace(i,i+1,"-");
} else if (s.charAt(i)=='-') {
s.replace(i,i+1,"+");
}
}
}
return s;
}else {
s.deleteCharAt(0).deleteCharAt(s.length()-1);
return s;
}
}
public int getStartBracket() {
return startBracket;
}
public void setStartBracket(int startBracket) {
this.startBracket = startBracket;
}
public int getEndBracket() {
return endBracket;
}
public void setEndBracket(int endBracket) {
this.endBracket = endBracket;
}
public String getResult() {
if(result-(int)result==0){
return String.valueOf((int)result);
} else return String.valueOf(result);
}
public void setResult(double result) {
this.result = result;
}
public String getText() {
return text;
}
}
package com.doreation.Calculator;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Listener implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
//鼠标划入
public void mouseEntered(MouseEvent e){
}
//鼠标划出
public void mouseExited(MouseEvent e){
}
}
package com.doreation.Calculator;
public class Main {
public static void main(String[] args) {
new Window();
}
}
package com.doreation.Calculator;
import javax.swing.*;
import java.awt.*;
public class ResizingLabel extends JTextArea {
private static final int MIN_FONT_SIZE = 20;
private static final int MAX_FONT_SIZE = 56;
private int lastFontSize;
public ResizingLabel() {
super();
setLineWrap(true);
setWrapStyleWord(true);
}
public ResizingLabel(String text) {
super(text);
resizeFont();
setAlignmentX(RIGHT_ALIGNMENT);
setLineWrap(true);
}
@Override
public void setText(String text) {
super.setText(text);
resizeFont();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// resizeFont();
}
private void resizeFont() {
String text = getText();
int width = getWidth();
int height = getHeight();
// 如果 JTextArea 的宽度或高度小于等于 0,直接返回
if (width <= 0 || height <= 0) {
return;
}
// 获取当前 JTextArea 的字体
FontMetrics fontMetrics = getFontMetrics(getFont());
// 计算 JTextArea 中文本的宽度和高度
int textWidth = fontMetrics.stringWidth(text);
int textHeight = fontMetrics.getHeight();
int textLength = getText().length();
// 根据当前的字体大小来判断是否需要调整字体大小
int fontSize = lastFontSize > 0 ? lastFontSize : getFont().getSize();
if (textWidth > width-10 && fontSize > MIN_FONT_SIZE) {
// 当前字体过大,需要缩小字体
while (textWidth > width-10 && fontSize > MIN_FONT_SIZE) {
fontSize--;
setFont(getFont().deriveFont((float) fontSize));
fontMetrics = getFontMetrics(getFont());
textWidth = fontMetrics.stringWidth(text);
textHeight = fontMetrics.getHeight();
}
} else if (textWidth < width - 10 && fontSize < MAX_FONT_SIZE) {
// 当前字体过小,需要增大字体
while (textWidth < width - 10 && fontSize < MAX_FONT_SIZE) {
fontSize++;
setFont(getFont().deriveFont((float) fontSize));
fontMetrics = getFontMetrics(getFont());
textWidth = fontMetrics.stringWidth(text);
textHeight = fontMetrics.getHeight();
}
}
lastFontSize = (int) fontSize;
}
}
package com.doreation.Calculator;
public class SqStackClass<E> {
final int initcapacity = 10;
private int capacity;
private E[] data;
private int top;
public SqStackClass(){
data = (E[])new Object[initcapacity];
capacity = initcapacity;
top = -1;//表示空
}
private void updatecapacity(int newcapacity){
E[] newdata=(E[])new Object[initcapacity];
for(int i=0; i<=top; i++){
newdata[i]=data[i];
}
capacity = newcapacity;
data = newdata;
}
public void push(E e){
if(top==capacity-1){
updatecapacity(2*(top+1));
}
top++;
data[top]=e;
}
public boolean empty(){
return top==-1;
}
public E pop(){
if(empty()){
throw new IllegalArgumentException("栈空");
}
E e = (E)data[top];
top--;
if(capacity>initcapacity && top+1==capacity/4){
updatecapacity(capacity/2);
}
return e;
}
public E peek(){
if(empty())
throw new IllegalArgumentException("栈空");
return (E)data[top];
}
}
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册