JAVA学习 第四章作业

  • 编写Java GUI程序,实现一个简单计算器。要求如下:

在这里插入图片描述

package Ex4;


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Ex4 {
    public static void main(String[] args) {
        MainWindow mainWindow = new MainWindow();
        MyListener myListener = new MyListener();
        mainWindow.setMyListener(myListener);
    }
}

class MainWindow extends JFrame {
    MainWindow() {
        init();
    }

    static String name[] = {"C", "÷", "×", "←", "7", "8", "9", "-", "4",
            "5", "6", "+", "1", "2", "3", "√", "%", "0", ".", "="};
    private JButton button[];
    JLabel label;

    private void init() {
        setTitle("模拟计算器—江海大");
        setLayout(new BorderLayout());
        Panel panel = new Panel();
        Panel panel2 = new Panel();
        panel.setPreferredSize(new Dimension(this.getWidth(), 50));
        //计算器一般都是靠右
        panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
        label = new JLabel();
        //设置字体大小
        label.setFont(new Font("宋体", Font.BOLD, 36));
        panel.add(label);
        button = new JButton[name.length];
        for (int i = 0; i < button.length; i++) {
            button[i] = new JButton(name[i]);
        }
        panel2.setLayout(new GridLayout(5, 4));
        for (JButton i : button)
            panel2.add(i);

        add(panel, BorderLayout.NORTH);
        add(panel2, BorderLayout.CENTER);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setSize(500, 500);
        setVisible(true);

    }

    public void setMyListener(MyListener myListener) {
        for (JButton b : button)
            b.addActionListener(myListener);
        myListener.setLabel(label);
    }
}

class MyListener implements ActionListener {
    private JLabel label;

    @Override
    public void actionPerformed(ActionEvent e) {
        String op = e.getActionCommand();
        String text = label.getText();
        switch (op) {
            case "C":
                label.setText("");
                break;
            case "←":
                text = text.substring(0, text.length() - 1);
                label.setText(text);
                break;
            case "=":
                text = fun(text);
                label.setText(text);
                break;
            case "√":
                text = fun(text);
                label.setText(Math.sqrt(Double.valueOf(text))+"");
                break;
            case "%":
                text = fun(text);
                label.setText(Double.valueOf(text)/100+"");
                break;
            default:
                label.setText(text + op);
        }

    }
    private String fun(String text){
        //正则表达式,匹配乘除
        Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?[×÷]\\d+(\\.\\d+)?");
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            //以乘除作为分割符
            String s[] = matcher.group().split("[×÷]");
            //计算
            double res = compute(Double.valueOf(s[0]), text.charAt(s[0].length()), Double.valueOf(s[1]));
            //将乘除得到的结果替换算式
            text = text.replace(matcher.group(), res + "");
            matcher = pattern.matcher(text);
        }
        pattern = Pattern.compile("\\d+(\\.\\d+)?[+\\-]\\d+(\\.\\d+)?");
        matcher = pattern.matcher(text);
        //正则表达式匹配加减
        while (matcher.find()) {
            String s[] = matcher.group().split("[+\\-]");
            double res = compute(Double.valueOf(s[0]), text.charAt(s[0].length()), Double.valueOf(s[1]));
            text = text.replace(matcher.group(), res + "");
            matcher = pattern.matcher(text);
        }
        return text;
    }
    //用于字符串解析计算
    public static double compute(double num1, char s, double num2) {
        switch (s) {
            case '-':
                return num1 - num2;
            case '+':
                return num1 + num2;
            case '×':
                return num1 * num2;
            case '÷':
                return num1 / num2;
            default:
                return 0;

        }
    }

    public void setLabel(JLabel label) {
        this.label = label;
    }
}
  • 总体来说还是比较简单的,在字符运算的时候我使用了正则表达式,会方便一些,如果不用正则表达式,可以考虑直接循环迭代,比如直接搜索±*/的位置,然后再进行相应的数值计算,会稍微麻烦一点.
  • 单目运算符,如果屏幕里面有算式,比如:2+2 此时按开方会先算出2+2再开方.
  • 待改进的地方:没有完善的错误输入处理,显示框的大小是固定的,比较理想应该是拉伸frame,显示框也跟着拉伸

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 程序填空题:完善程序,实现包括一个复选框的窗体。点选复选框,通过相应的事件处理后,能够在控制台显示复选框的选择信息。
    在这里插入图片描述
  • 比第一题简单很多,没有太特别的地方
    在这里插入图片描述
    在这里插入图片描述
package Ex4;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;


/*---在(1)处进行类声明:类名为MyCheck,继承自Frame类---*/
//(1)
class MyCheck extends JFrame {
    public MyCheck() {
        super("GUI程序设计实验");
        /*---在(2)处创建面板对象,并设置其布局管理方式为FlowLayout---*/
        //(2)
        JPanel p = new JPanel(new FlowLayout());
        Checkbox cbx = new Checkbox("isPassed");

        /*---在(3)处完成两个功能:向面板中加入组件cbx,为组件cbx注册监听器。此处填写两行语句---*/
        //(3)
        p.add(cbx);
        cbx.addItemListener(new MyListener());
        add(p);

        /*---在(4)处设置窗体的属性:设置大小为(250,100),设置为可见。此处填写两行语句---*/
        //(4)
        setSize(250, 100);
        setVisible(true);
    }

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

    /*---在(5)处声明内部类的类头:类名自定义---*/
    //(5)
    class MyListener implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
            System.out.println(e);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/rglkt/article/details/106117808