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();
}
}
Asked
Active
Viewed 914 times
0
Alex Lip
- 45
-
1Скорее всего, ответ на ваш вопрос есть тут: Регулярное выражение для чисел с плавающей точкой – Uranus Dec 23 '17 at 16:53
1 Answers
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();
}
Николай Беляков
- 703
-
Выражение исправил, но все равно удается вводить несколько точек. Может, что-то нужно в цикле дописать? – Alex Lip Dec 24 '17 at 09:22
-
Если вводить более одной точки, то текст не будет соответствовать регулярке. Можете проверить: https://regex101.com/ – Николай Беляков Dec 24 '17 at 09:32
-
-
Ну вообще так тоже результата не какого не получилось. Все же хочется использовать регулярные выражения. – Alex Lip Dec 24 '17 at 14:23
-
-
-