21xrx.com
2025-03-25 02:46:01 Tuesday
文章检索 我的文章 写文章
Java设计一个简单的计算器界面
2023-06-10 19:15:42 深夜i     13     0
Java GUI

我最近尝试了一下Java GUI的设计,写了一个简单的计算器界面,分享一下经验。

首先是界面的设计,我使用了JFrame和JPanel等组件进行搭建,然后再添加一些按钮和文本框等控件。代码如下:

import javax.swing.*;
import java.awt.*;
public class Calculator extends JFrame {
  private JPanel panel = new JPanel();
  public Calculator() {
    setTitle("Calculator");
    setSize(300, 400);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    panel.setLayout(new GridLayout(4, 4, 5, 5));
    add(panel, BorderLayout.CENTER);
    createButton("7");
    createButton("8");
    createButton("9");
    createButton("/");
    createButton("4");
    createButton("5");
    createButton("6");
    createButton("*");
    createButton("1");
    createButton("2");
    createButton("3");
    createButton("-");
    createButton("0");
    createButton(".");
    createButton("=");
    createButton("+");
  }
  private void createButton(String text) {
    JButton button = new JButton(text);
    button.setFont(new Font("Arial", Font.PLAIN, 25));
    panel.add(button);
  }
  public static void main(String[] args){
    new Calculator();
  }
}

其中,JFrame是窗口,JPanel是容器,可以将其他控件添加到其中。在createButton方法中,我们可以创建一个按钮,然后将其添加到JPanel中,最后设置其字体等属性。

接下来是实现计算器的基本功能,我使用了JTextField来显示计算结果,使用了Stack来实现后缀表达式的计算。代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;
public class Calculator extends JFrame implements ActionListener {
  private JPanel panel = new JPanel();
  private JTextField inputField = new JTextField();
  private JTextField outputField = new JTextField();
  public Calculator() {
    setTitle("Calculator");
    setSize(300, 400);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    inputField.setFont(new Font("Arial", Font.PLAIN, 25));
    outputField.setFont(new Font("Arial", Font.PLAIN, 25));
    inputField.setEditable(false);
    outputField.setEditable(false);
    panel.setLayout(new GridLayout(4, 4, 5, 5));
    add(inputField, BorderLayout.NORTH);
    add(outputField, BorderLayout.SOUTH);
    add(panel, BorderLayout.CENTER);
    createButton("7");
    createButton("8");
    createButton("9");
    createButton("/");
    createButton("4");
    createButton("5");
    createButton("6");
    createButton("*");
    createButton("1");
    createButton("2");
    createButton("3");
    createButton("-");
    createButton("0");
    createButton(".");
    createButton("=");
    createButton("+");
  }
  private void createButton(String text) {
    JButton button = new JButton(text);
    button.setFont(new Font("Arial", Font.PLAIN, 25));
    button.addActionListener(this);
    panel.add(button);
  }
  @Override
  public void actionPerformed(ActionEvent e) {
    String command = e.getActionCommand();
    if (command.equals("=")) {
      String expr = inputField.getText();
      double result = eval(expr);
      outputField.setText(String.valueOf(result));
    } else {
      inputField.setText(inputField.getText() + command);
    }
  }
  private double eval(String expr) {
    Stack
  stack = new Stack<>();
 
    String[] tokens = expr.split("\\s+");
    for (String token : tokens) {
      if (isNumber(token)) {
        stack.push(Double.parseDouble(token));
      } else {
        double num2 = stack.pop();
        double num1 = stack.pop();
        double result = 0;
        switch (token) {
          case "+":
            result = num1 + num2;
            break;
          case "-":
            result = num1 - num2;
            break;
          case "*":
            result = num1 * num2;
            break;
          case "/":
            result = num1 / num2;
            break;
        }
        stack.push(result);
      }
    }
    return stack.pop();
  }
  private boolean isNumber(String token) {
    try {
      Double.parseDouble(token);
      return true;
    } catch (NumberFormatException e)
      return false;
    
  }
  public static void main(String[] args){
    new Calculator();
  }
}

在这里,我们将计算表达式的逻辑封装在了eval方法中,通过判断每一个token的类型来进行不同的操作,并使用Stack来辅助计算。在actionPerformed方法中,我们根据用户点击的按钮来做出不同的响应,如果点击了等号,则计算表达式的结果并显示在outputField中,否则将按钮上的字符添加到inputField中。

至此,我们就完成了一个简单的计算器界面的设计和实现。总体而言,Java GUI的设计相比较其他语言会有些繁琐,但使用起来还是比较方便的。希望我的经验对大家有所帮助。

,Stack,后缀表达式

  
  

评论区