С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java ME (J2ME)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
2 / 0 / 1
Регистрация: 11.02.2012
Сообщений: 31

Запрет многократных нажатий на кнопку

29.09.2012, 21:26. Показов 3188. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер
Столкнулся с такой проблемой: при работе клиента на j2me (сокеты, связь с асинхронным сервером) пользователи частенько умудряются нажать на одну и ту же кнопку несколько раз, то есть, как пример, в окне выбора продукта успевают нажать кнопку "Выбрать" 3-4 раза до того момента, пока данные уйдут серверу, обработаются, вернутся и обновят экран - в результате серверу уходят те самые 3-4 запроса на выполнение одной и той же операции, от чего хотелось бы уйти. Как можно поступить в данном случае? Есть несколько идей, но в каждой видны жёсткие недочёты:
1 - в конце обработчика каждого нажатия блокировать или вообще удалять кнопку;
2 - в каждом обработчике вешать счётчик нажатий, и проверять, не нажималась ли ещё эта кнопка, и если нажатие уже было - не выполнять действий, а после каждого обновления экрана счётчики на кнопках обнулять;
3 - завести какой-нибудь таймер, и разрешать нажатия только раз в секунду (не особо пока понимаю, как такое будет работать - но это лишь идея).

Но может я всё усложняю и есть настройки мидлета, которые запрещают жать часто кнопки? Потому что, например, если по первому пункту блокировать кнопку - многократное хардварное нажатие на первом экране после обновления и появления новых кнопок нажмёт одну из кнопок второго экрана, аналогично и второй пункт.

Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.09.2012, 21:26
Ответы с готовыми решениями:

Переместить кнопку по углам формы и посчитать количество нажатий на кнопку
помогите, пожалуйста, переместить кнопку по углам формы и посчитать количество нажатий на кнопку в компоненте edit. после 10 нажатия на...

Запрет нажатий клавиш
Как запретить пользователю нажимать клавишу PrtSc power home cmd shift + цифра .. ?

Запрет нажатий на объекты
Привет. Есть сцена, на ней сверху вниз летят объекты, на них нужно нажимать чтоб они уничтожались. Так же на ней есть кнопка паузы. Когда я...

7
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
29.09.2012, 23:47
При отправке генерить CRC32 со всех полей и если при следующем нажатии оно такое же как и предыдущее, то игнорить и не отправлять
0
2 / 0 / 1
Регистрация: 11.02.2012
Сообщений: 31
30.09.2012, 19:45  [ТС]
Идея заманчивая, но, на мой взгляд, немного затратная: основных форм - около 5, и все с разнородным содержимым. Т.е., имеется и выбор из списка, где данные по мере появления подгружаются с сервера, и логин-пароль, где периодически жмут 2-3 раза Войти, и просто отправка одного значения (типа суммы или количества).. Я что-то подобное рассматривал (хотел запоминать сгененированную для отправки текстовую строку, и уже потом её сравнивать) - но отмёл как неэффективную.
Придумал ещё вариант с некоей заглушкой - при нажатии кнопки отправки отображать форму с текстом "обработка..", а уже при получении обработанных данных с сервера отображать то, что нужно.
Но всё равно ни один из этих вариантов (CRC, заглушка) не оберегает от нажатия кнопки на полученном с сервера окне при многократном нажатии клавиш на предыдущем окне (пример: в списке выбора заказа жмём много раз кнопку Выбрать, данные уходят, обрабатываются, прорисовывается новое окно уже со своей кнопкой, и происходит непроизвольное нажатие на эту новую кнопку). То есть эту ситуацию уже можно и не обрабатывать - вина клиента, что не смотрит, на что жмёт - но было бы интересно знать, есть ли варианты, не допускающие такого.

Добавлено через 6 часов 45 минут
Выявил ещё один нюанс: если зажать кнопку и не отпускать, то обрабатывается это как многократные нажатия, самое страшное - с частотой большей, чем простые нажатия. В такой ситуации запоминание отправляемой строки или CRC корректно не срабатывают - процентах в 20 случаях строка отправляется более 1 раза (тестирую сейчас на nokia 6300).
Поэтому попробовал вставить заглушку - работает на удивление приятно и безглючно, органично вписалось.
Но всё равно на общем фоне повис вопрос: почему многократные нажатия или зажатие кнопки в нижеуказанном коде допускает огрехи и производит двойную отсылку данных (аналогично испробован способ счётчика нажатий, который выдаёт такой же результат):
Java
1
2
3
4
5
6
public void commandAction(Command c, Displayable ds) {
if (c == sendCommand) {
    oldSendMsg=sendMsg;//запоминаем старые отправляемые данные
    sendMsg="some_sended_data";
    if(sendMsg!=oldSendMsg)
        sender.send(sendMsg);
Java
1
2
3
4
5
if (c == sendCommand) {
    clickCount++;
    sendMsg="some_sended_data";
    if(clickCount<=1)
        sender.send(sendMsg);
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
30.09.2012, 19:54
не понимаю я вашей проблемы, мне кажется вы создаёте себе сами условия для трудностей:
1. считать crc32 быстро можно сдвигами
2. почему отправка данных должна идти синхронно нажатиям?
создайте очередь и продюсьте туда нажатия, а консьюмер будет считать crc (или что там вам больше по душе) и решать делать ли post, это могут быть 2 независимых потока и всё будет ок
1
2 / 0 / 1
Регистрация: 11.02.2012
Сообщений: 31
30.09.2012, 20:17  [ТС]
В j2me с CRC32 вообще не работал (это мой первый проект, не только j2me - но и java в любых проявлениях), поэтому стараюсь усложнять всё чем меньше, тем лучше.. И про консьюмер поэтому тоже не слышал, и не знаю, как это всё с наименьшими затратами (по времени и по ресурсоёмкости) внедрить
Потоков для нужд миддлета у меня уже 4 штуки есть, плюс 3 таймера (1 постоянный и 2 включаются/отключаются по мере работы), поэтому создавать ещё и очередь.. Не сильно ли накладно? Все ли телефоны нормально потянут такое?
Трудностей я и правда наворотил, разгрести и сделать по-человечески уже немало времени займёт - например, из обработчиков 15 моих кнопок 9 отправляют какие-то данные, из них 5 сначала отправляют, потом по получении данных формируют соответствующую форму, а 4 сначала рисуют формы (в том числе и списки), а уже по получении данных заполняют их значениями, делают видимыми-невидимыми соответствующие поля и пр. Поэтому как сюда очередь запилить - пока без понятия, браться пока не буду - сначала всё заведу таким топорным методом (нажали кнопку - отправили данные-данные обработали-данные отрисовали), внедрю, а когда будет свободное время - перепишу всё как и должно было быть с самого начала.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
30.09.2012, 21:11
Цитата Сообщение от andrew_jr20 Посмотреть сообщение
И про консьюмер поэтому тоже не слышал
http://www.java2s.com/Tutorial... nsumer.htm
1
2 / 0 / 1
Регистрация: 11.02.2012
Сообщений: 31
04.10.2012, 11:45  [ТС]
Шикарная штука )))) Спасибо за ссылку, по коду всё ясно, попозже внедрю именно такой вариант
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
04.10.2012, 13:02
Может я чего не понимаю в javaME - но почему нельзя после первого нажатия на кнопку заблокировать ее до получения ответа от сервера??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2012, 13:02
Помогаю со студенческими работами здесь

Запрет нажатий сочетаний клавиш для определенного процесса
Всем привет! В Visual Basic я новичок, но мне нужно решить одну задачу. Запретить нажатие следующих клавиш Alt + tab alt + Ctrl +...

Подсчет нажатий на кнопку
Есть кнопка, при нажатии которой каждый раз увеличивается число,а есть та, которая уменьшает. Но почему-то увеличивает и уменьшает только...

Несколько нажатий на кнопку
Можно ли создать программу, которая бы при первом нажатии на кнопку выполняла одни действия, а при втором нажатии на ту же кнопку - другие?...

Подсчет нажатий на кнопку+
Добрый день. Раньше знал php о за год забыл на проч все. Помогите если не трудно. Нужно сделать что-то напоминающее голосование. Сделать...

Количество нажатий на кнопку
Проблема в следующем, мне надо чтобы в процедуре ButtonClick, т.е. в процедуре, описывающей действия программы при нажатие на кнопку,...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru