21xrx.com
2024-12-23 00:53:32 Monday
登录
文章检索 我的文章 写文章
Java设计一个简单的计算器界面
2023-06-10 19:15:42 深夜i     --     --
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,后缀表达式

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复