FishC 发表于 2024-4-7 14:05:17

卷帘红尘亦爱她 发表于 2024-04-07 14:05
@FishC1 用Java完成该代码编写一个日记本功能的程序, ...

import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Diary {
    public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
      System.out.print("请输入姓名:");
      String name = scanner.nextLine();
      System.out.print("请输入日期(格式:yyyy-MM-dd):");
      String date = scanner.nextLine();
      System.out.print("请输入天气:");
      String weather = scanner.nextLine();
      System.out.print("请输入日记标题:");
      String title = scanner.nextLine();
      System.out.print("请输入内容:");
      String content = scanner.nextLine();

      // 构造文件名
      String fileName = name + "日记本.txt";
      try (FileOutputStream fos = new FileOutputStream(fileName, true)) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String currentTime = sdf.format(new Date());

            // 写入日记内容
            fos.write(("姓名:" + name + "\n").getBytes());
            fos.write(("日期:" + date + "\n").getBytes());
            fos.write(("时间:" + currentTime + "\n").getBytes());
            fos.write(("天气:" + weather + "\n").getBytes());
            fos.write(("标题:" + title + "\n").getBytes());
            fos.write(("内容:" + content + "\n").getBytes());
            fos.write("\n".getBytes());

            System.out.println("日记已保存至本地文件:" + fileName);
      } catch (IOException e) {
            System.out.println("保存失败:" + e.getMessage());
      }
    }
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 13:54:44

@FishC1 利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器。

FishC 发表于 2024-4-11 13:55:04

卷帘红尘亦爱她 发表于 2024-04-11 13:54
@FishC1 利用Java Swing 图形组件开发一个可以进行简 ...

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame implements ActionListener {
    private JTextField inputField; // 输入框
    private JButton[] numberButtons; // 数字按钮数组
    private JButton[] operatorButtons; // 运算符按钮数组
    private JButton equalButton; // 等号按钮
    private JButton clearButton; // 清除按钮

    public Calculator() {
      setTitle("简单计算器");
      setLayout(new BorderLayout());
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      // 初始化组件
      inputField = new JTextField();
      inputField.setHorizontalAlignment(JTextField.RIGHT);
      add(inputField, BorderLayout.NORTH);

      JPanel buttonPanel = new JPanel();
      buttonPanel.setLayout(new GridLayout(4, 4));

      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
            buttonPanel.add(numberButtons);
      }

      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (int i = 0; i < 4; i++) {
            operatorButtons.addActionListener(this);
            buttonPanel.add(operatorButtons);
      }

      equalButton = new JButton("=");
      equalButton.addActionListener(this);
      buttonPanel.add(equalButton);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);
      buttonPanel.add(clearButton);

      add(buttonPanel, BorderLayout.CENTER);

      pack();
      setLocationRelativeTo(null);
      setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      if (source == clearButton) {
            inputField.setText(""); // 清空输入框
      } else if (source == equalButton) {
            String expression = inputField.getText(); // 获取输入表达式
            double result = calculate(expression); // 调用计算方法计算结果
            inputField.setText(String.valueOf(result)); // 显示结果
      } else {
            JButton button = (JButton) source;
            String text = button.getText();
            inputField.setText(inputField.getText() + text); // 在输入框中添加按钮上的数字或运算符
      }
    }

    // 计算表达式结果的方法
    private double calculate(String expression) {
      double result = 0;
      try {
            result = Double.parseDouble(expression);
      } catch (NumberFormatException e) {
            // 表达式不是一个数字,进行四则运算
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("js");
            try {
                result = (double) engine.eval(expression);
            } catch (ScriptException ex) {
                JOptionPane.showMessageDialog(this, "表达式错误!", "错误", JOptionPane.ERROR_MESSAGE);
            }
      }
      return result;
    }

    public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Calculator();
            }
      });
    }
}

这个示例使用了Java Swing库来创建一个简单的图形化计算器。计算器的界面包含一个文本字段和一些按钮,用于输入数字和执行运算。操作包括加、减、乘、除和等号。当用户点击等号按钮时,程序会获取文本字段中的表达式,并调用计算方法来计算结果,并在文本字段中显示结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 13:56:07

@FishC1通过用java 利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器。

FishC 发表于 2024-4-11 13:56:42

卷帘红尘亦爱她 发表于 2024-04-11 13:56
@FishC1通过用java 利用Java Swing 图形组件开发一个 ...

当然可以!下面是一个简单的Java Swing图形化计算器示例代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame implements ActionListener {
    private JTextField textField;
    private JButton[] numberButtons;
    private JButton[] operatorButtons;
    private JButton equalButton;
    private JButton clearButton;
    private String display = "";

    public Calculator() {
      setTitle("简单计算器");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(300, 400);
      setLocationRelativeTo(null);

      textField = new JTextField();
      textField.setPreferredSize(new Dimension(300, 50));
      textField.setHorizontalAlignment(JTextField.RIGHT);

      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
      }

      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      equalButton = new JButton("=");
      equalButton.addActionListener(this);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);

      setLayout(new GridLayout(5, 3));
      add(textField);
      for (JButton button : numberButtons) {
            add(button);
      }
      for (JButton button : operatorButtons) {
            add(button);
      }
      add(equalButton);
      add(clearButton);

      setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) {
            display = "";
      } else if (e.getSource() == equalButton) {
            try {
                display = String.valueOf(eval(display));
            } catch (ArithmeticException ex) {
                display = "错误";
            }
      } else {
            display += ((JButton) e.getSource()).getText();
      }

      textField.setText(display);
    }

    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }

                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') {
                  while ((ch >= '0' && ch <= '9') || ch == '.') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }

                return x;
            }
      }.parse();
    }

    public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Calculator();
            }
      });
    }
}

运行上述代码,将弹出一个简单的图形化计算器窗口,你可以在这个窗口中进行四则运算。希望对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 14:01:53

@FishC1对每行代码进行注释            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }

                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') {
                  while ((ch >= '0' && ch <= '9') || ch == '.') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }

                return x;
            }

FishC 发表于 2024-4-11 14:03:32

卷帘红尘亦爱她 发表于 2024-04-11 14:01
@FishC1对每行代码进行注释            int pos = -1, ...

下面是对每行代码进行注释的解释:

int pos = -1, ch; // 初始化位置和字符变量

void nextChar() { // 获取下一个字符
    ch = (++pos < str.length()) ? str.charAt(pos) : -1;
}

boolean eat(int charToEat) { // 检查并吃掉指定的字符
    while (ch == ' ') {
      nextChar();
    }
    if (ch == charToEat) {
      nextChar();
      return true;
    }
    return false;
}

double parse() { // 解析整个表达式
    nextChar();
    double x = parseExpression();
    if (pos < str.length()) {
      throw new RuntimeException("意外字符: " + (char) ch);
    }
    return x;
}

double parseExpression() { // 解析表达式中的加减法
    double x = parseTerm();
    for (;;) {
      if (eat('+')) {
            x += parseTerm();
      } else if (eat('-')) {
            x -= parseTerm();
      } else {
            return x;
      }
    }
}

double parseTerm() { // 解析表达式中的乘除法
    double x = parseFactor();
    for (;;) {
      if (eat('*')) {
            x *= parseFactor();
      } else if (eat('/')) {
            x /= parseFactor();
      } else {
            return x;
      }
    }
}

double parseFactor() { // 解析表达式中的因子
    if (eat('+')) { // 处理正号
      return parseFactor();
    }
    if (eat('-')) { // 处理负号
      return -parseFactor();
    }
    double x; // 临时变量
    int startPos = this.pos; // 记录起始位置
    if (eat('(')) { // 处理括号
      x = parseExpression();
      eat(')');
    } else if ((ch >= '0' && ch <= '9') || ch == '.') { // 处理数字
      while ((ch >= '0' && ch <= '9') || ch == '.') {
            nextChar();
      }
      x = Double.parseDouble(str.substring(startPos, this.pos));
    } else {
      throw new RuntimeException("意外字符: " + (char) ch);
    }
    return x;
}

这段代码实现了一个简单的四则运算解析器。它能够从一个字符串中解析出数学表达式,并计算结果。其中,parse()方法调用parseExpression()方法来解析整个表达式,parseExpression()方法又调用parseTerm()方法来解析加减法,parseTerm()方法又调用parseFactor()方法来解析乘除法。eat()函数用于检查和吃掉指定的字符。整个过程通过递归和循环来实现对表达式的解析和计算。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 14:04:25

@FishC1对每行代码进行注释import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class Calculator extends JFrame implements ActionListener {
    private JTextField textField;
    private JButton[] numberButtons;
    private JButton[] operatorButtons;
    private JButton equalButton;
    private JButton clearButton;
    private String display = "";

    public Calculator() {
      setTitle("简单计算器");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(300, 400);
      setLocationRelativeTo(null);

      textField = new JTextField();
      textField.setPreferredSize(new Dimension(300, 50));
      textField.setHorizontalAlignment(JTextField.RIGHT);

      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
      }

      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      equalButton = new JButton("=");
      equalButton.addActionListener(this);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);

      setLayout(new GridLayout(5, 3));
      add(textField);
      for (JButton button : numberButtons) {
            add(button);
      }
      for (JButton button : operatorButtons) {
            add(button);
      }
      add(equalButton);
      add(clearButton);

      setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) {
            display = "";
      } else if (e.getSource() == equalButton) {
            try {
                display = String.valueOf(eval(display));
            } catch (ArithmeticException ex) {
                display = "错误";
            }
      } else {
            display += ((JButton) e.getSource()).getText();
      }

      textField.setText(display);
    }

    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }

                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') {
                  while ((ch >= '0' && ch <= '9') || ch == '.') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }

                return x;
            }
      }.parse();
    }

    public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Calculator();
            }
      });
    }
}

FishC 发表于 2024-4-11 14:05:08

卷帘红尘亦爱她 发表于 2024-04-11 14:04
@FishC1对每行代码进行注释import javax.swing.*;
im ...

下面是对每行代码进行注释的解释:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Calculator extends JFrame implements ActionListener {
    private JTextField textField;
    private JButton[] numberButtons; // 数字按钮数组
    private JButton[] operatorButtons; // 操作符按钮数组
    private JButton equalButton;
    private JButton clearButton;
    private String display = "";

    public Calculator() {
      setTitle("简单计算器");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(300, 400);
      setLocationRelativeTo(null);

      textField = new JTextField();
      textField.setPreferredSize(new Dimension(300, 50));
      textField.setHorizontalAlignment(JTextField.RIGHT);

      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
      }

      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      equalButton = new JButton("=");
      equalButton.addActionListener(this);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);

      setLayout(new GridLayout(5, 3));
      add(textField);
      for (JButton button : numberButtons) {
            add(button);
      }
      for (JButton button : operatorButtons) {
            add(button);
      }
      add(equalButton);
      add(clearButton);

      setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) { // 清除按钮点击事件
            display = "";
      } else if (e.getSource() == equalButton) { // 等于按钮点击事件
            try {
                display = String.valueOf(eval(display)); // 调用eval方法计算表达式结果
            } catch (ArithmeticException ex) {
                display = "错误";
            }
      } else { // 数字按钮和操作符按钮点击事件
            display += ((JButton) e.getSource()).getText();
      }
      textField.setText(display);
    }

    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1; // 获取下一个字符
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar(); // 跳过空格
                }
                if (ch == charToEat) {
                  nextChar(); // 如果当前字符与目标字符匹配,则获取下一个字符
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar(); // 获取第一个字符
                double x = parseExpression(); // 解析表达式
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch); // 如果还有剩余字符,抛出异常
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm(); // 解析项
                for (; ; ) {
                  if (eat('+')) { // 如果下一个字符是+,则解析下一项并相加
                        x += parseTerm();
                  } else if (eat('-')) { // 如果下一个字符是-,则解析下一项并相减
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor(); // 解析因子
                for (; ; ) {
                  if (eat('*')) { // 如果下一个字符是*,则解析下一个因子并相乘
                        x *= parseFactor();
                  } else if (eat('/')) { // 如果下一个字符是/,则解析下一个因子并相除
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) { // 如果下一个字符是+,则解析下一个因子
                  return parseFactor();
                }
                if (eat('-')) { // 如果下一个字符是-,则解析下一个因子并取其相反数
                  return -parseFactor();
                }
                double x;
                int startPos = this.pos;
                if (eat('(')) { // 如果下一个字符是(,则解析表达式并跳过)
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') { // 如果下一个字符是数字或者小数点
                  while ((ch >= '0' && ch <= '9') || ch == '.') { // 解析连续的数字和小数点
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos)); // 将解析出的字符串转换为double类型
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch); // 非法字符,抛出异常
                }
                return x;
            }
      }.parse();
    }

    public static void main(String[] args) {
      new Calculator();
    }
}

这个程序创建了一个简单的Swing图形化计算器。它包含一个文本框用于显示输入和结果,以及数字按钮、操作符按钮、等于按钮和清除按钮。用户可以通过点击按钮输入数字和操作符,然后通过点击等于按钮来计算结果。其中的eval函数实现了一个简单的表达式求值算法。

希望这个例子可以帮助你理解如何用Java Swing开发一个简单的图形化计算器!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 14:22:56


@FishC1对该代码进行修改使按钮大小不变文本框与清除键单独在第一行,剩下的键位以四行四列排列在文本框与清除键下边import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// 计算器类,继承自JFrame,并实现ActionListener接口
class Calculator extends JFrame implements ActionListener {
    private JTextField textField; // 文本框,用于显示表达式和结果
    private JButton[] numberButtons; // 数字按钮数组
    private JButton[] operatorButtons; // 运算符按钮数组
    private JButton equalButton; // 等号按钮
    private JButton clearButton; // 清除按钮
    private String display = ""; // 用于存储当前显示的内容

    // 构造方法
    public Calculator() {
      setTitle("简单计算器"); // 设置窗口标题
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作
      setSize(300, 400); // 设置窗口大小
      setLocationRelativeTo(null); // 设置窗口居中显示

      textField = new JTextField(); // 初始化文本框
      textField.setPreferredSize(new Dimension(300, 50)); // 设置文本框大小
      textField.setHorizontalAlignment(JTextField.RIGHT); // 设置文本框文本右对齐

      numberButtons = new JButton; // 初始化数字按钮数组
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i)); // 创建数字按钮并添加事件监听
            numberButtons.addActionListener(this);
      }

      operatorButtons = new JButton; // 初始化运算符按钮数组
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      equalButton = new JButton("="); // 初始化等号按钮
      equalButton.addActionListener(this);

      clearButton = new JButton("C"); // 初始化清除按钮
      clearButton.addActionListener(this);

      setLayout(new GridLayout(4, 4)); // 设置布局为4行4列的网格布局
      add(textField); // 添加文本框到界面

// 添加清除按钮到界面,并设置为占据一整行
      add(clearButton);
      clearButton.setPreferredSize(new Dimension(300, 50)); // 设置清除按钮大小
      add(new JPanel()); // 添加一个空白面板,使清除按钮居中显示

// 添加数字按钮到界面
      for (JButton button : numberButtons) {
            add(button);
      }

// 添加运算符按钮到界面
      for (JButton button : operatorButtons) {
            add(button);
      }

      add(equalButton); // 添加等号按钮到界面


      setVisible(true); // 设置界面可见
    }

    // 处理按钮点击事件
    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) {
            display = ""; // 清空显示内容
      } else if (e.getSource() == equalButton) {
            try {
                display = String.valueOf(eval(display)); // 计算表达式并显示结果
            } catch (ArithmeticException ex) {
                display = "错误"; // 若出现异常,显示错误信息
            }
      } else {
            display += ((JButton) e.getSource()).getText(); // 更新显示内容
      }

      textField.setText(display); // 更新文本框显示内容
    }

    // 计算表达式的方法
    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }

                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') {
                  while ((ch >= '0' && ch <= '9') || ch == '.') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }

                return x;
            }
      }.parse();
    }

    // 主方法
    public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Calculator(); // 创建计算器实例
            }
      });
    }
}

FishC 发表于 2024-4-11 14:23:33

卷帘红尘亦爱她 发表于 2024-04-11 14:22
@FishC1对该代码进行修改使按钮大小不变文本框与清除 ...

修改后的代码,按钮大小不变,文本框和清除键单独在第一行,剩下的键位以四行四列排列在文本框和清除键下边:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Calculator extends JFrame implements ActionListener {
    private JTextField textField;
    private JButton[] numberButtons;
    private JButton[] operatorButtons;
    private JButton equalButton;
    private JButton clearButton;
    private String display = "";

    public Calculator() {
      setTitle("简单计算器");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(300, 400);
      setLocationRelativeTo(null);

      textField = new JTextField();
      textField.setPreferredSize(new Dimension(300, 50));
      textField.setHorizontalAlignment(JTextField.RIGHT);

      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
      }

      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      equalButton = new JButton("=");
      equalButton.addActionListener(this);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);

      setLayout(new GridLayout(5, 4));
      add(textField);
      add(clearButton);
      clearButton.setPreferredSize(new Dimension(200, 50));
      add(new JPanel());

      for (int i = 7; i <= 9; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      for (int i = 4; i <= 6; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      for (int i = 1; i <= 3; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      add(numberButtons);
      add(operatorButtons);
      add(equalButton);

      setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) {
            display = "";
      } else if (e.getSource() == equalButton) {
            try {
                display = String.valueOf(eval(display));
            } catch (ArithmeticException ex) {
                display = "错误";
            }
      } else {
            display += ((JButton) e.getSource()).getText();
      }

      textField.setText(display);
    }

    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }
                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if (ch >= '0' && ch <= '9') {
                  while (ch >= '0' && ch <= '9') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }
      }.parse();
    }

    public static void main(String[] args) {
      new Calculator();
    }
}

现在按钮大小保持不变,文本框和清除键单独在第一行,剩下的键位以四行四列排列在文本框和清除键下方。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 14:31:23

@FishC1对该代码进行修改使按钮大小不变加入小数点键,文本框大小变为按钮的三倍与清除键单独在第一行,剩下的键位以四行四列排列在文本框与清除键下边

FishC 发表于 2024-4-11 14:32:02

卷帘红尘亦爱她 发表于 2024-04-11 14:31
@FishC1对该代码进行修改使按钮大小不变加入小数点键 ...

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// 计算器类,继承自JFrame,并实现ActionListener接口
class Calculator extends JFrame implements ActionListener {
    private JTextField textField; // 文本框,用于显示表达式和结果
    private JButton numberButtons; // 数字按钮数组
    private JButton operatorButtons; // 运算符按钮数组
    private JButton equalButton; // 等号按钮
    private JButton clearButton; // 清除按钮
    private String display = ""; // 用于存储当前显示的内容

    // 构造方法
    public Calculator() {
      setTitle("简单计算器"); // 设置窗口标题
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作
      setSize(300, 400); // 设置窗口大小
      setLocationRelativeTo(null); // 设置窗口居中显示

      textField = new JTextField(); // 初始化文本框
      textField.setPreferredSize(new Dimension(300, 50)); // 设置文本框大小
      textField.setHorizontalAlignment(JTextField.RIGHT); // 设置文本框文本右对齐

      numberButtons = new JButton; // 初始化数字按钮数组
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i)); // 创建数字按钮并添加事件监听
            numberButtons.addActionListener(this);
      }
      numberButtons = new JButton("."); // 创建小数点按钮
      numberButtons.addActionListener(this);

      operatorButtons = new JButton; // 初始化运算符按钮数组
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      equalButton = new JButton("="); // 初始化等号按钮
      equalButton.addActionListener(this);

      clearButton = new JButton("C"); // 初始化清除按钮
      clearButton.addActionListener(this);

      setLayout(new GridLayout(5, 4)); // 设置布局为5行4列的网格布局

      add(textField); // 添加文本框到界面
      textField.setPreferredSize(new Dimension(300, 150)); // 修改文本框大小,为按钮的3倍

      add(clearButton); // 添加清除按钮到界面,并设置为占据一整行
      clearButton.setPreferredSize(new Dimension(300, 50)); // 设置清除按钮大小

      add(new JPanel()); // 添加一个空白面板,使清除按钮居中显示

      // 添加数字按钮到界面
      for (JButton button : numberButtons) {
            add(button);
      }

      // 添加运算符按钮到界面
      for (JButton button : operatorButtons) {
            add(button);
      }

      add(equalButton); // 添加等号按钮到界面

      setVisible(true); // 设置界面可见
    }

    // 处理按钮点击事件
    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) {
            display = ""; // 清空显示内容
      } else if (e.getSource() == equalButton) {
            try {
                display = String.valueOf(eval(display)); // 计算表达式并显示结果
            } catch (ArithmeticException ex) {
                display = "错误"; // 若出现异常,显示错误信息
            }
      } else {
            display += ((JButton) e.getSource()).getText(); // 更新显示内容
      }
      textField.setText(display); // 更新文本框显示内容
    }

    // 计算表达式的方法
    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }
                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') {
                  while ((ch >= '0' && ch <= '9') || ch == '.') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }
      }.parse();
    }

    // 测试
    public static void main(String[] args) {
      new Calculator();
    }
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 14:33:40

@FishC1对该代码进行修改使按钮大小不变加入小数点键,文本框大小变为按钮的三倍与清除键单独在第一行,剩下的键位以四行四列排列在文本框与清除键下边import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Calculator extends JFrame implements ActionListener {
    private JTextField textField;
    private JButton[] numberButtons;
    private JButton[] operatorButtons;
    private JButton equalButton;
    private JButton clearButton;
    private String display = "";

    public Calculator() {
      setTitle("简单计算器");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 400);
      setLocationRelativeTo(null);

      textField = new JTextField();
      textField.setPreferredSize(new Dimension(300, 50)); // 修改文本框长度为键位长度的三倍
      textField.setHorizontalAlignment(JTextField.RIGHT);

      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
      }

      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      equalButton = new JButton("=");
      equalButton.addActionListener(this);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);

      setLayout(new GridLayout(5, 4));
      add(textField);
      add(clearButton);
      clearButton.setPreferredSize(new Dimension(50, 50));
      add(new JPanel());

      for (int i = 7; i <= 9; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      for (int i = 4; i <= 6; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      for (int i = 1; i <= 3; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      add(numberButtons);
      add(operatorButtons);
      add(equalButton);

      setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) {
            display = "";
      } else if (e.getSource() == equalButton) {
            try {
                display = String.valueOf(eval(display));
            } catch (ArithmeticException ex) {
                display = "错误";
            }
      } else {
            display += ((JButton) e.getSource()).getText();
      }

      textField.setText(display);
    }

    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }
                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if (ch >= '0' && ch <= '9') {
                  while (ch >= '0' && ch <= '9') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }
      }.parse();
    }

    public static void main(String[] args) {
      new Calculator();
    }
}

FishC 发表于 2024-4-11 14:34:15

卷帘红尘亦爱她 发表于 2024-04-11 14:33
@FishC1对该代码进行修改使按钮大小不变加入小数点键 ...

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Calculator extends JFrame implements ActionListener {
    private JTextField textField;
    private JButton[] numberButtons;
    private JButton[] operatorButtons;
    private JButton decimalButton;
    private JButton equalButton;
    private JButton clearButton;
    private String display = "";

    public Calculator() {
      setTitle("简单计算器");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 500); // 修改窗口高度为500
      setLocationRelativeTo(null);

      textField = new JTextField();
      textField.setPreferredSize(new Dimension(300, 150)); // 修改文本框长度为按钮宽度的三倍
      textField.setHorizontalAlignment(JTextField.RIGHT);

      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
      }

      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (JButton button : operatorButtons) {
            button.addActionListener(this);
      }

      decimalButton = new JButton(".");
      decimalButton.addActionListener(this);

      equalButton = new JButton("=");
      equalButton.addActionListener(this);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);

      setLayout(new GridLayout(6, 4)); // 修改布局为6行4列
      add(textField);
      add(clearButton);
      clearButton.setPreferredSize(new Dimension(100, 50)); // 修改清除按钮宽度
      add(decimalButton);

      for (int i = 7; i <= 9; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      for (int i = 4; i <= 6; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      for (int i = 1; i <= 3; i++) {
            add(numberButtons);
      }
      add(operatorButtons);

      add(numberButtons);
      add(equalButton);
      add(operatorButtons);

      setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == clearButton) {
            display = "";
      } else if (e.getSource() == equalButton) {
            try {
                display = String.valueOf(eval(display));
            } catch (ArithmeticException ex) {
                display = "错误";
            }
      } else {
            display += ((JButton) e.getSource()).getText();
      }
      textField.setText(display);
    }

    public static double eval(final String str) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') {
                  nextChar();
                }
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                  if (eat('+')) {
                        x += parseTerm();
                  } else if (eat('-')) {
                        x -= parseTerm();
                  } else {
                        return x;
                  }
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (; ; ) {
                  if (eat('*')) {
                        x *= parseFactor();
                  } else if (eat('/')) {
                        x /= parseFactor();
                  } else {
                        return x;
                  }
                }
            }

            double parseFactor() {
                if (eat('+')) {
                  return parseFactor();
                }
                if (eat('-')) {
                  return -parseFactor();
                }
                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') { // 添加小数点判断
                  while ((ch >= '0' && ch <= '9') || ch == '.') {
                        nextChar();
                  }
                  x = Double.parseDouble(str.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("意外字符: " + (char) ch);
                }
                return x;
            }
      }.parse();
    }
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 14:38:48

@FishC1利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器,有+,-,*,/,.和清除键,且文本框和清除键在第一行,其他的在下方以4*4分布

FishC 发表于 2024-4-11 14:39:19

卷帘红尘亦爱她 发表于 2024-04-11 14:38
@FishC1利用Java Swing 图形组件开发一个可以进行简单 ...

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame implements ActionListener {
    private JTextField textField;
    private JButton[] numberButtons;
    private JButton[] operatorButtons;
    private JButton equalButton;
    private JButton clearButton;
    private String display = "";

    public Calculator() {
      setTitle("简单计算器");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 400);
      setLocationRelativeTo(null);

      // 创建文本框和清除键
      textField = new JTextField();
      textField.setPreferredSize(new Dimension(300, 50));
      textField.setHorizontalAlignment(JTextField.RIGHT);

      clearButton = new JButton("C");
      clearButton.addActionListener(this);

      // 创建数字键按钮
      numberButtons = new JButton;
      for (int i = 0; i < 10; i++) {
            numberButtons = new JButton(String.valueOf(i));
            numberButtons.addActionListener(this);
      }

      // 创建运算符按钮
      operatorButtons = new JButton;
      operatorButtons = new JButton("+");
      operatorButtons = new JButton("-");
      operatorButtons = new JButton("*");
      operatorButtons = new JButton("/");
      for (int i = 0; i < 4; i++) {
            operatorButtons.addActionListener(this);
      }

      // 创建等号按钮
      equalButton = new JButton("=");
      equalButton.addActionListener(this);

      // 设置布局为网格布局,5行4列
      setLayout(new GridLayout(5, 4));
      add(textField);
      add(clearButton);
      add(new JPanel());
      
      // 添加数字按钮
      for (int i = 7; i <= 9; i++) {
            add(numberButtons);
      }
      add(operatorButtons); // +
      
      for (int i = 4; i <= 6; i++) {
            add(numberButtons);
      }
      add(operatorButtons); // -
      
      for (int i = 1; i <= 3; i++) {
            add(numberButtons);
      }
      add(operatorButtons); // *
      
      add(numberButtons);
      add(operatorButtons); // /
      add(new JButton("."));
      add(equalButton);

      setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
      JButton source = (JButton) e.getSource();
      if (source == clearButton) { // 清除键
            display = "";
      } else if (source == equalButton) { // 等号键
            display = evaluate(display);
      } else { // 数字键或运算符键
            display += source.getText();
      }
      textField.setText(display);
    }

    private String evaluate(String expression) {
      try {
            return String.valueOf(eval(expression));
      } catch (Exception e) {
            return "Error";
      }
    }

    private double eval(String expression) {
      return new Object() {
            int pos = -1, ch;

            void nextChar() {
                ch = (++pos < expression.length()) ? expression.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') nextChar();
                if (ch == charToEat) {
                  nextChar();
                  return true;
                }
                return false;
            }

            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < expression.length()) throw new RuntimeException("Unexpected: " + (char) ch);
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (;;) {
                  if (eat('+')) x += parseTerm();
                  else if (eat('-')) x -= parseTerm();
                  else return x;
                }
            }

            double parseTerm() {
                double x = parseFactor();
                for (;;) {
                  if (eat('*')) x *= parseFactor();
                  else if (eat('/')) x /= parseFactor();
                  else return x;
                }
            }

            double parseFactor() {
                if (eat('+')) return parseFactor();
                if (eat('-')) return -parseFactor();

                double x;
                int startPos = this.pos;
                if (eat('(')) {
                  x = parseExpression();
                  eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') {
                  while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();
                  x = Double.parseDouble(expression.substring(startPos, this.pos));
                } else {
                  throw new RuntimeException("Unexpected: " + (char) ch);
                }

                if (eat('^')) x = Math.pow(x, parseFactor());

                return x;
            }
      }.parse();
    }

    public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Calculator();
            }
      });
    }
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 15:03:57

@FishC1通过该代码对你所书写代码进行优化import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


class Calculator extends JFrame{

    //定义JTextField 显示的字符串
    String string = new String();

    public Calculator(){
      // 创建一个 Container 容器并初始化。
      Container container=getContentPane();
      //设置容器布局:网格布局样式,5行1列,水平间距50,垂直间距10
      container.setLayout(new GridLayout(5,1,50,10));
      // 创建一个 JTextField 对象并初始化。 JTextField 是用于显示操作和计算结果的文本框。
      // 参数 26 表明可以显示 26 列的文本内容
      JTextField result_TextField = new JTextField(26);
      //把字符串赋值给文本框
      result_TextField.setText(string);
      //创建一个带文本的按钮-->清除键
      JButton clear_Button = new JButton("    clear   ");
      //给按钮添加事件监听器
      clear_Button.addActionListener(clearButtonListener(result_TextField));
      //数字键0到9
      JButton button0 = new JButton("0");
      button0.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button1 = new JButton("1");
      button1.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button2 = new JButton("2");
      button2.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button3 = new JButton("3");
      button3.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button4 = new JButton("4");
      button4.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button5 = new JButton("5");
      button5.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button6 = new JButton("6");
      button6.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button7 = new JButton("7");
      button7.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button8 = new JButton("8");
      button8.addActionListener(numbersAndOperatorsListener(result_TextField));
      JButton button9 = new JButton("9");
      button9.addActionListener(numbersAndOperatorsListener(result_TextField));
      //计算命令按钮 加减乘除以及小数点等
      //小数点
      JButton button_spot = new JButton(".");
      button_spot.addActionListener(numbersAndOperatorsListener(result_TextField));
      //加
      JButton button_add = new JButton("+");
      button_add.addActionListener(numbersAndOperatorsListener(result_TextField));
      //减
      JButton button_subtract = new JButton("-");
      button_subtract.addActionListener(numbersAndOperatorsListener(result_TextField));
      //乘
      JButton button_multiply = new JButton("*");
      button_multiply.addActionListener(numbersAndOperatorsListener(result_TextField));
      //除
      JButton button_divide = new JButton("/");
      button_divide.addActionListener(numbersAndOperatorsListener(result_TextField));
      //等于
      JButton button_equal = new JButton("=");
      button_equal.addActionListener(equalButtonListener(result_TextField));
      //创建JPanel面板组件并且采用 BorderLayout布局格式
      JPanel panel = new JPanel(new BorderLayout());
      //在面板中添加文本框组件-->靠左
      panel.add(result_TextField,BorderLayout.WEST);
      //在面板中添加文本框组件-->靠右
      panel.add(clear_Button, BorderLayout.EAST);
      JPanel pan1 = new JPanel(new GridLayout(1,4,5,5));
      pan1.add(button7);
      pan1.add(button8);
      pan1.add(button9);
      pan1.add(button_divide);
      JPanel pan2 = new JPanel(new GridLayout(1,4,5,5));
      pan2.add(button4);
      pan2.add(button5);
      pan2.add(button6);
      pan2.add(button_multiply);
      JPanel pan3 = new JPanel(new GridLayout(1,4,5,5));
      pan3.add(button1);
      pan3.add(button2);
      pan3.add(button3);
      pan3.add(button_subtract);
      JPanel pan4 = new JPanel(new GridLayout(1,4,5,5));
      pan4.add(button0);
      pan4.add(button_spot);
      pan4.add(button_equal);
      pan4.add(button_add);
      //在容器上添加面板控件
      container.add(panel);
      container.add(pan1);
      container.add(pan2);
      container.add(pan3);
      container.add(pan4);
      //将容器外部特性实例化
      setTitle(" Calculator ");
      //设窗体的大小   宽和高
      setSize(400,250);
      //设定窗体的可视化
      setVisible(true);
      //设置窗体的关闭方式
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    //数字和运算符监听事件
    public ActionListener numbersAndOperatorsListener(JTextField result_TextField ){
      return new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton jButton = (JButton) e.getSource();
                System.out.println("获取事件监听器:"+jButton.getText());
                string += jButton.getText();
                result_TextField.setText(string);
            }
      };
    }
    //使用JDK自带的类可以实现执行字符串中的运算公式的功能
    static ScriptEngine javaScriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
    //等于运算
    public ActionListener equalButtonListener(JTextField result_TextField){

      returnnew ActionListener() {
            String str =null;
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("result_TextField -->"+ result_TextField.getText());
                str = result_TextField.getText();
                string = equal(str);
                result_TextField.setText(string);
            }
            public String equal(String str){
                String result ="";
                try {
                  System.out.println(javaScriptEngine.eval(str));
                  result = javaScriptEngine.eval(str).toString();
                } catch (Exception t) {
                }
                return result;
            }
      };
    }
    //清除文本框的内容
    public ActionListener clearButtonListener(JTextField result_TextField){
      returnnew ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                string = "";
                result_TextField.setText(string);
            }
      };
    }

    public static void main(String[] args) {
      Calculator calculator = new Calculator();
    }

}

FishC 发表于 2024-4-11 15:04:31

卷帘红尘亦爱她 发表于 2024-04-11 15:03
@FishC1通过该代码对你所书写代码进行优化import java ...

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Calculator extends JFrame {
    private String expression = "";

    public Calculator() {
      Container container = getContentPane();
      container.setLayout(new GridLayout(5, 1, 50, 10));

      JTextField resultTextField = new JTextField(26);
      resultTextField.setText(expression);

      JButton clearButton = new JButton("    Clear   ");
      clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                expression = "";
                resultTextField.setText(expression);
            }
      });

      JPanel panel = new JPanel(new BorderLayout());
      panel.add(resultTextField, BorderLayout.WEST);
      panel.add(clearButton, BorderLayout.EAST);

      JPanel numPanel = new JPanel(new GridLayout(1, 4, 5, 5));
      JPanel operatorPanel = new JPanel(new GridLayout(1, 4, 5, 5));

      ActionListener numAndOperatorListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton button = (JButton) e.getSource();
                expression += button.getText();
                resultTextField.setText(expression);
            }
      };

      for (int i = 1; i <= 9; i++) {
            JButton numButton = new JButton(Integer.toString(i));
            numButton.addActionListener(numAndOperatorListener);
            numPanel.add(numButton);
      }

      JButton zeroButton = new JButton("0");
      zeroButton.addActionListener(numAndOperatorListener);
      JButton dotButton = new JButton(".");
      dotButton.addActionListener(numAndOperatorListener);
      JButton equalButton = new JButton("=");
      equalButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
                try {
                  Object result = scriptEngine.eval(expression);
                  expression = result.toString();
                  resultTextField.setText(expression);
                } catch (Exception ex) {
                  expression = "";
                  resultTextField.setText("Error");
                }
            }
      });
      JButton addButton = new JButton("+");
      addButton.addActionListener(numAndOperatorListener);
      JButton subtractButton = new JButton("-");
      subtractButton.addActionListener(numAndOperatorListener);
      JButton multiplyButton = new JButton("*");
      multiplyButton.addActionListener(numAndOperatorListener);
      JButton divideButton = new JButton("/");
      divideButton.addActionListener(numAndOperatorListener);

      operatorPanel.add(zeroButton);
      operatorPanel.add(dotButton);
      operatorPanel.add(equalButton);
      operatorPanel.add(addButton);
      operatorPanel.add(subtractButton);
      operatorPanel.add(multiplyButton);
      operatorPanel.add(divideButton);

      container.add(panel);
      container.add(numPanel);
      container.add(operatorPanel);

      setTitle("Calculator");
      setSize(400, 250);
      setVisible(true);
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
      SwingUtilities.invokeLater(() -> new Calculator());
    }
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

卷帘红尘亦爱她 发表于 2024-4-11 15:05:51

@FishC1对你所写代码进行修改将下方按钮改为四行
页: 1 2 3 4 5 6 [7] 8 9 10 11
查看完整版本: 地图设计