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

// * Created by 1 on 25.11.2017.

public class Calculator extends JFrame {

    JFrame jframe = new JFrame("Калькулятор"); //форма
    //Создание панели для кнопок грид лояут(Менеджер расположения)
    JPanel panel = new JPanel(new GridLayout(4, 4, 5, 5));
    JPanel batton_equally = new JPanel(new BorderLayout(1, 1));
    //Создаем панель для текста
    JPanel panel_text = new JPanel(new BorderLayout());
    //Создаем текстовое поле
    JTextField jtextfield = new JTextField(20);

    //Создаем кнопки
    JButton bt1 = new JButton("7");
    JButton bt2 = new JButton("8");
    JButton bt3 = new JButton("9");
    JButton bt31 = new JButton("С");
    JButton bt4 = new JButton("4");
    JButton bt5 = new JButton("5");
    JButton bt6 = new JButton("6");
    JButton bt61 = new JButton("/");
    JButton bt7 = new JButton("1");
    JButton bt8 = new JButton("2");
    JButton bt9 = new JButton("3");
    JButton bt91 = new JButton("*");
    JButton bt10 = new JButton(".");
    JButton bt11 = new JButton("0");
    JButton bt12 = new JButton("=");
    JButton bt13 = new JButton("+");
    JButton bt14 = new JButton("-");

    public Calculator() {
        double[] first_value = {0};
        double second_value = 0;
        String[] operation = {"+"};

        jframe.setSize(300, 300);
        //Обработка щелчка на системной кнопке закрытия окна
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setLocationRelativeTo(null);  //?
        jframe.setLayout(new BorderLayout());
        //Выравнивание текста в поле по правому краю
        jtextfield.setHorizontalAlignment(JTextField.RIGHT);
        //Установка шрифта и размер текстового поля
        jtextfield.setFont(new Font("Times New Roman", Font.PLAIN, 20));
        //Задаем вид и размер шрифта кнопок
        bt31.setFont(new Font("Tahoma", Font.BOLD, 15));
        bt61.setFont(new Font("Tahoma", Font.BOLD, 15));
        bt91.setFont(new Font("Tahoma", Font.BOLD, 15));
        bt10.setFont(new Font("Tahoma", Font.BOLD, 15));
        bt12.setFont(new Font("Tahoma", Font.BOLD, 20));
        bt13.setFont(new Font("Tahoma", Font.BOLD, 15));
        bt14.setFont(new Font("Tahoma", Font.BOLD, 20));
        //Добавление кнопки на панель
        panel.add(bt1);
        panel.add(bt2);
        panel.add(bt3);
        panel.add(bt31);
        panel.add(bt4);
        panel.add(bt5);
        panel.add(bt6);
        panel.add(bt61);
        panel.add(bt7);
        panel.add(bt8);
        panel.add(bt9);
        panel.add(bt91);
        panel.add(bt10);
        panel.add(bt11);
        panel.add(bt13);
        panel.add(bt14);
        batton_equally.add(bt12);
        //цвет панели
        panel.setBackground(Color.CYAN);
        //Добавляем текстовое поле на панель
        panel_text.add(jtextfield, BorderLayout.NORTH);
        //Добавляем панель текста на форму
        jframe.add(panel_text, BorderLayout.NORTH);
        //Добавляем панель кнопок на форму
        jframe.add(panel, BorderLayout.CENTER);
        jframe.add(batton_equally, BorderLayout.SOUTH);
        //Видимость формы
        jframe.setVisible(true);

        //Обработчики события "Нажатие на кнопку"
        //ActionListener - слушатель
        bt1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "7");
            }
        });
        bt2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "8");
            }
        });
        bt3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "9");
            }
        });
        bt4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "4");
            }
        });
        bt5.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "5");
            }
        });
        bt6.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "6");
            }
        });
        bt7.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "1");
            }
        });
        bt8.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "2");
            }
        });
        bt9.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "3");
            }
        });
        bt10.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + ".");
            }
        });
        bt11.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jtextfield.setText(jtextfield.getText() + "0");
            }
        });
        //При нажатии на "C" удаляем последнюю цифру
            bt31.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String temp = jtextfield.getText();
                    //обрабатываем исключение, чтобы не было возможности стереть пустое значение
                    try {
                        jtextfield.setText(temp.substring(0, temp.length() - 1));
                    } catch (Exception e1) {
                        jtextfield.setText(jtextfield.getText() + "Пусто!");
                        //jtextfield.setForeground(Color.RED);  //bug
                    }
                }
            });

//        Работаем с кнопками операции
//        Для каждого арифметического действия запомнить его, сохранить текущее число в переменной first_value и
//        сбрасывать число для ввода нового
        bt14.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    first_value[0] = Double.valueOf(jtextfield.getText());
                }catch (Exception e1) {}
                    jtextfield.setText("");
                    operation[0] = "-";
            }
        });
        bt61.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    first_value[0] = Double.valueOf(jtextfield.getText());
                } catch (Exception e1) {}
                jtextfield.setText("");
                operation[0] = "/";
                }

        });
        bt91.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    first_value[0] = Double.valueOf(jtextfield.getText());
                }catch (Exception e1) {}
                jtextfield.setText("");
                operation[0] = "*";
            }
        });
        bt13.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                first_value[0] = Double.valueOf(jtextfield.getText());
                }catch (Exception e1) {}
                jtextfield.setText("");
                operation[0] = "+";
            }
        });

        // При нажатии на равно, считаем второе значение с текстового поля
        bt12.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                double secondValue = Double.valueOf(jtextfield.getText());
                if ("+".equals(operation[0])) {
                    jtextfield.setText((first_value[0] + secondValue) + "");
                }
                if ("-".equals(operation[0])) {
                    jtextfield.setText((first_value[0] - secondValue) + "");
                }
                if ("/".equals(operation[0])) {
                    jtextfield.setText((first_value[0] / secondValue) + "");
                    }
                if ("*".equals(operation[0])) {
                    jtextfield.setText((first_value[0] * secondValue) + "");
                }
                }catch (Exception e1) {}
            }
        });

        Pattern p = Pattern.compile("[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?\\s*([+-\\\\*/])\\s*[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$");
        Matcher m = p.matcher(jtextfield.setText(jtextfield.getText()));
        return m.matches();

    }

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

    }
    }

1 Answers1

0

^(\d+)((\.{0,1})(\d+))?$ вот так пойдет наверное

Добавьте в обработчик нажатия кнопки проверку строки в текстовом поле

bt10.addActionListener(new ActionListener() {
        String text;
        @Override
        public void actionPerformed(ActionEvent e) {
            text = jtextfield.getText();
            if(!text.contains(".")){
                jtextfield.setText(jtextfield.getText() + ".");
            } 
        }
    });

Вот с regex:

bt10.addActionListener(new ActionListener() {
            String text;
            String newText;
            @Override
            public void actionPerformed(ActionEvent e) {
                text = jtextfield.getText();
                newText = jtextfield.getText() + ".";
                if(validinput(newText)){
                    jtextfield.setText(newText);
                }
            }
        });


private boolean validinput(String input){
        Pattern p = Pattern.compile("^(\\d+)(\\.{0,1})?$");
        return p.matcher(input).find();
    }