Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
2 / 2 / 1
Регистрация: 18.01.2018
Сообщений: 16

Запрет ввода более 1 точки: в чем ошибка?

18.01.2018, 08:58. Показов 3769. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста, найти ошибку в коде

Задача: запретить вводить более одной точки
Цветом выделен проблемный фрагмент кода

package Calculator;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class CalcEngine implements ActionListener {

Calc parent; // ссылка на объект Calc (на окно калькулятора)

char selectedAction = ' '; // + - * /
double currentResult = 0; // промежуточные значения

CalcEngine (Calc parent) { // конструктор сохраняет ссылку на окно калькулятора в переменной
// экземлпяра текущего класса
this.parent = parent;
}

@Override
public void actionPerformed(ActionEvent e) {

JButton clickedButton = (JButton)e.getSource(); // получаем источник события
// источнк события был приведен к типу JButton

String dispFieldText = parent.displayField.getText();
// получить текст с дисплея калькулятора

double displayValue = 0; // переменная для хранения числа с дисплея

if (!"".equals(dispFieldText)){// если не пустой
if ((-1) != dispFieldText.indexOf('.')) { // если выражение не вернуло -1,
// значит, точка есть и нужно выяснить нет ли еще точек
int count = 0;
for (int i = 0; i < dispFieldText.length(); i++) {
if (dispFieldText.charAt(i) == '.'){
count++;
}
}
if (count == 1) {
displayValue = Double.parseDouble(dispFieldText);
} else {
parent.displayField.setText("Ошибка: более одной точки");
}
}
else {
displayValue = Double.parseDouble(dispFieldText);
}
}


Object src = e.getSource();

if (src == parent.buttonPlus) {
selectedAction = '+';
currentResult = displayValue; // сохранить введенное число в переменной
parent.displayField.setText(""); // очистить окно
} else if (src == parent.buttonMinus) {
selectedAction = '-';
currentResult = displayValue;
parent.displayField.setText("");
} else if (src == parent.buttonDiv) {
selectedAction = '/';
currentResult = displayValue;
parent.displayField.setText("");
} else if (src == parent.buttonMulti){
selectedAction = '*';
currentResult = displayValue;
parent.displayField.setText("");
} else if (src == parent.buttonEqual){
if (selectedAction == '+') {
currentResult +=displayValue;
parent.displayField.setText(""+currentRe sult);
} else if (selectedAction == '-') {
currentResult -=displayValue;
parent.displayField.setText(""+currentRe sult);
} else if (selectedAction == '/') {
if (!"".equals(dispFieldText)) {
currentResult /=displayValue;
parent.displayField.setText(""+currentRe sult);
} else if ("".equals(dispFieldText)) {
parent.displayField.setText("На ноль делить нельзя!");
}
} else if (selectedAction == '*') {
currentResult *=displayValue;
parent.displayField.setText(""+currentRe sult);
}
} else {
String clickedButtonLabel = clickedButton.getText();
parent.displayField.setText(dispFieldTex t+clickedButtonLabel);
}
}
}

Добавлено через 17 минут
Прошу прощения, впервые на форуме - код в читабельном виде:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package Calculator;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
 
public class CalcEngine implements ActionListener {
 
Calc parent; // ссылка на объект Calc (на окно калькулятора)
 
char selectedAction = ' '; // + - * /
double currentResult = 0; // промежуточные значения
 
CalcEngine (Calc parent) { // конструктор сохраняет ссылку на окно калькулятора в переменной
// экземлпяра текущего класса
this.parent = parent;
}
 
@Override
public void actionPerformed(ActionEvent e) {
 
JButton clickedButton = (JButton)e.getSource(); // получаем источник события
// источнк события был приведен к типу JButton
 
String dispFieldText = parent.displayField.getText();
// получить текст с дисплея калькулятора
 
double displayValue = 0; // переменная для хранения числа с дисплея
 
if (!"".equals(dispFieldText)){// если не пустой
if ((-1) != dispFieldText.indexOf('.')) { // если выражение не вернуло -1,
// значит, точка есть и нужно выяснить нет ли еще точек
int count = 0;
for (int i = 0; i < dispFieldText.length(); i++) {
if (dispFieldText.charAt(i) == '.'){
count++;
}
}
if (count == 1) {
displayValue = Double.parseDouble(dispFieldText);
} else {
parent.displayField.setText("Ошибка: более одной точки");
} 
}
else {
displayValue = Double.parseDouble(dispFieldText);
}
}
 
Object src = e.getSource();
 
if (src == parent.buttonPlus) {
selectedAction = '+';
currentResult = displayValue; // сохранить введенное число в переменной
parent.displayField.setText(""); // очистить окно
} else if (src == parent.buttonMinus) {
selectedAction = '-';
currentResult = displayValue; 
parent.displayField.setText("");
} else if (src == parent.buttonDiv) {
selectedAction = '/';
currentResult = displayValue; 
parent.displayField.setText("");
} else if (src == parent.buttonMulti){
selectedAction = '*';
currentResult = displayValue; 
parent.displayField.setText("");
} else if (src == parent.buttonEqual){
if (selectedAction == '+') {
currentResult +=displayValue;
parent.displayField.setText(""+currentResult);
} else if (selectedAction == '-') {
currentResult -=displayValue;
parent.displayField.setText(""+currentResult);
} else if (selectedAction == '/') {
if (!"".equals(dispFieldText)) {
currentResult /=displayValue;
parent.displayField.setText(""+currentResult);
} else if ("".equals(dispFieldText)) {
parent.displayField.setText("На ноль делить нельзя!");
}
} else if (selectedAction == '*') {
currentResult *=displayValue;
parent.displayField.setText(""+currentResult);
}
} else {
String clickedButtonLabel = clickedButton.getText();
parent.displayField.setText(dispFieldText+clickedButtonLabel);
}
} 
}
Добавлено через 3 минуты
Проблема в том, что не работает код с 30 по 48 строку, в чем здесь может быть причина?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2018, 08:58
Ответы с готовыми решениями:

Интерполяция.Задан список аргументов и значений не более чем из 10 пар. Выдать функцию, проходящую через эти точки
Добрый день, помогите пожалуйста решить задачу по Lisp. Задан список аргументов и значений не более чем из 10 пар. Выдать функцию,...

Ошибка при загруженности флешки более чем на 50%
Пол-года назад купил флешку (Transcend Ultra Speed 32Gb), сначала всё было нормально, потом через некоторое время стал замечать, что если...

Как сделать запрет ввода букв в поле для ввода input
Здравствуйте! Есть стандартное поле ввода &lt;input type='text' name='name1' size='30' maxlength='11'&gt; предназначенное для ввода...

7
85 / 67 / 25
Регистрация: 09.10.2017
Сообщений: 208
18.01.2018, 09:10
Здравствуйте!

Есть наверное ещё класс Calc
Не могу проверить Ваш код, запустив на выполнение
Возможно кто-то просто прочитает код и поймёт в чём дело
0
2 / 2 / 1
Регистрация: 18.01.2018
Сообщений: 16
18.01.2018, 09:12  [ТС]
Здравствуйте

да, есть еще Calc:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package Calculator;
 
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.BorderLayout;
 
public class Calc {
        
        // объявление всех компонентов калькулятора
        JButton button0 = new JButton("0");
        JButton button1 = new JButton("1");
        JButton button2 = new JButton("2");
        JButton button3 = new JButton("3");
        JButton button4 = new JButton("4");
        JButton button5 = new JButton("5");
        JButton button6 = new JButton("6");
        JButton button7 = new JButton("7");
        JButton button8 = new JButton("8");
        JButton button9 = new JButton("9");
        JButton buttonPoint = new JButton(".");
        JButton buttonEqual = new JButton("=");
        
        JButton buttonPlus = new JButton("+");
        JButton buttonMinus = new JButton("-");
        JButton buttonMulti = new JButton("*");
        JButton buttonDiv = new JButton("/");
        
        JPanel windowContent = new JPanel(); // первая основная панель 
        
        JTextField displayField = new JTextField(30); // текстовое поле
        
        // задаем конструктор экземпляра класса
        Calc(){
        // задаем схему первой панели
        BorderLayout bl = new BorderLayout();
        
        windowContent.setLayout(bl);
        windowContent.add ("North", displayField);
        
        JPanel p1 = new JPanel();
        GridLayout gr = new GridLayout (4,3);
        p1.setLayout(gr);
        p1.add(button1);
        p1.add(button2);
        p1.add(button3);
        p1.add(button4);
        p1.add(button5);
        p1.add(button6);
        p1.add(button7);
        p1.add(button8);
        p1.add(button9);
        p1.add(button0);
        p1.add(buttonPoint);
        p1.add(buttonEqual);
        
        windowContent.add ("Center", p1);
        
        JPanel p2 = new JPanel();
        GridLayout gr1 = new GridLayout(4,1);
        p2.setLayout(gr1);
        p2.add(buttonPlus);
        p2.add(buttonMinus);
        p2.add(buttonMulti);
        p2.add(buttonDiv);
        
       // помещаем панель р2 в восточную часть
       windowContent.add("East", p2);
       
       // создаем фрейм и назначаем ему основную панель
       JFrame frame = new JFrame("Calculator");
       frame.setContentPane(windowContent);
       
       // делаем размер окна достаточным, чтобы все вместить
       frame.pack();
       
       // отображаем окно
       frame.setVisible(true);
       
       CalcEngine calcEng1 = new CalcEngine(this);
        // это экземпляр слушателя
        // таким образом ссылка на экземпляр Calc сохраняется в переменной parent
        
       button0.addActionListener(calcEng1);
       button1.addActionListener(calcEng1);
       button2.addActionListener(calcEng1);
       button3.addActionListener(calcEng1);
       button4.addActionListener(calcEng1);
       button5.addActionListener(calcEng1);
       button6.addActionListener(calcEng1);
       button7.addActionListener(calcEng1);
       button8.addActionListener(calcEng1);
       button9.addActionListener(calcEng1);
       
       buttonPoint.addActionListener(calcEng1);
       buttonPlus.addActionListener(calcEng1);
       buttonMinus.addActionListener(calcEng1);
       buttonDiv.addActionListener(calcEng1);
       buttonMulti.addActionListener(calcEng1);
       buttonEqual.addActionListener(calcEng1);
    }
        
    public static void main(String[] args){
        Calc calc = new Calc();
    }    
}
0
85 / 67 / 25
Регистрация: 09.10.2017
Сообщений: 208
18.01.2018, 13:49
Здравствуйте!

Не работает только 42 строка
Java
1
parent.displayField.setText("Ошибка: более одной точки");
не пойму почему
в этот else заходит и count считает
только в текстовое поле текст не добавляет, хотя далее по коду текстовое поле очищает

ps каждый раз надо запускать - нет никакого сброса результата

Добавлено через 3 часа 0 минут
Здравствуйте!

Если вместо этой строки присвоить dispFieldText значение
Java
1
dispFieldText = "Ошибка: более одной точки";
тогда выведется в текстовое поле ошибка + ещё один символ (который считывается в clickedButtonLabel),
так как у Вас в конце кода идёт вывод информации в текстовое поле:
Java
1
2
String clickedButtonLabel = clickedButton.getText();
parent.displayField.setText(dispFieldText+clickedButtonLabel);
1
2 / 2 / 1
Регистрация: 18.01.2018
Сообщений: 16
18.01.2018, 14:21  [ТС]
Спасибо!
Интересно, все же, почему строка 42 не работает
в отладчике смотрю - действительно, count считает и число это не учитывается в дальнейших расчетах.. но текст почему-то не выводится
0
15 / 15 / 1
Регистрация: 15.01.2018
Сообщений: 42
18.01.2018, 21:47

Не по теме:

найти ошибку в коде
После этой фразы мы забыли о дебаггере и парсере...



Попробуйте в таком виде:
Java
1
2
3
4
5
6
7
public static int countDots(String str) {
    int ret = 0;
    for (char element : str.toCharArray()){
        if (element == '.') ret++;
    }
    return ret;
}
А вообще все остальные действия через parent в коде работают? Если да, то НАКОНЕЦ-ТО отформатируйте код, если нет, значит вы не так определили экземпляр parent.

Добавлено через 3 минуты
Кстати, да, зачем Вам количество точек, просто не давайте юзеру ставить точки на этапе ввода. Почему бы и нет? Тогда можно даже MsgBox допилить. Ведь действительно, зачем проверять ошибки, если их можно выявить сразу...
1
2 / 2 / 1
Регистрация: 18.01.2018
Сообщений: 16
19.01.2018, 20:34  [ТС]
Спасибо!
Цитата Сообщение от thematdev Посмотреть сообщение
Кстати, да, зачем Вам количество точек, просто не давайте юзеру ставить точки на этапе ввода. Почему бы и нет? Тогда можно даже MsgBox допилить. Ведь действительно, зачем проверять ошибки, если их можно выявить сразу...
Была такая мысль. Дело в том, что текст считывается не посимвольно, а целой строкой

Добавлено через 11 минут
я только начинаю изучать Java и пока не представляю как в класс-обработчик передавать по одному символу для проверки вводимых значений. Подскажете, это разумно организовать? Было бы интересно расширить горизонт
0
15 / 15 / 1
Регистрация: 15.01.2018
Сообщений: 42
19.01.2018, 20:54
Цитата Сообщение от r_r Посмотреть сообщение
Спасибо!

Была такая мысль. Дело в том, что текст считывается не посимвольно, а целой строкой

Добавлено через 11 минут
я только начинаю изучать Java и пока не представляю как в класс-обработчик передавать по одному символу для проверки вводимых значений. Подскажете, это разумно организовать? Было бы интересно расширить горизонт
Вы не поняли меня. У Вас есть кнопка ".". Вам нужно всего лишь посчитать клики по этой кнопке:


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Calc
buttonPoint.addActionCommand("point")
 
// Calc Engine:
int count = 0;
@Override
public void actionPerformed(ActionEvent e) {
    if (e.getCommand().equals("point")) {
        count++;
        if (count == 2) {
            parent.displayField.setText("Ошибка, более одной точки!");
            return;
        }
    }
    // Дальше Ваш код)
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2018, 20:54
Помогаю со студенческими работами здесь

Как в VBA в поле Textbox сделать запрет на ввод более одного слова (или запрет на ввод пробелов)?
Добрый день. Нужно, чтобы в поле TextBox можно было ввести не более одного слова (в противном случае выводится сообщение). Приведенный ниже...

OLE WORD ошибка при открытии более чем 5 файлов.
Суть программы в том, что нужно открыть несколько файлов, записать в них данные и сохранить. В приложении около 15 dot шаблонов, которые то...

В чем ошибка? Перегрузка оператора ввода\вывода
Доброго времени суток. Где я допустил ошибку? Перегрузка оператора как-будто игнорируется. Выводит просто &quot;test&quot;, а я ожидаю...

Запрет ввода только минуса в ячейке StringGrid, и запрет на ввод минуса между цифрами
Ребята,очень нужна ваша помощь!Нужно сделать запрет ввода ТОЛЬКО минуса в ячейке и запрет на ввод минуса между цифрами, чтобы не получилось...

ввод данных, ошибка при вводе чисел, более чем 3 миллиарда
не выводит значение более 3-ех миллиардов, пишет - Ошибка ввода. Программа завершена (Program23.pas, строка 75) помогите пожалуйста...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru