Java как заблокировать кнопки

Блокировать кнопку

Написал программу Апплета на NetBeans, всё хорошо работает, но нужно чтобы после нажатия на кнопку она же заблокировалась. А после нажатия на другую кнопку разблокировалась. Нашёл полезную сылку http://frolov-lib.ru/programmi. index.html
Ввожу

всё запускается, но кнопка не блокируется! Подскажите что не так, или киньте сылку как можно заблокировать кнопку.

Добавлено через 15 минут
Всё нашёл ответ уже сам, видно никто не сталкивался с таким!!
Кому интересно:

Boolean b; Если b=true(включить),Если b=false(выключить); jButton2.setEnabled(b);

Блокировать одну кнопку по нажатию на другую
Ребята, у меня две кнопки на форме. При нажатии одной кнопки, вторая должна блокироваться от.

Блокировать кнопку после нажатия на нее
как заблокировать кнопку после нажатия на неё ? EnableWindow(hButton, 0) не помогает.

Блокировать кнопку при достижении конца списка Combobox’а
Привет всем! Подскажите пожалуйста,как сделать чтобы при достижении конца списка combobox,нажав.

a href="index.php" id="mylink">Ссылка/a> div id="button">Заблокировать/div>
$('#button')css('cursor','pointer').toggle(function() { $('#mylink').preventDefault(); // отменяем стандартное действие которое браузер делает при нажатии на ссылку $('#button').text('Разблокировать'); // Название кнопки изменилось }, function() { $('#mylink').preventDefault(false); // Вертаем стандартное действие ссылке $('#button').text('Заблокировать'); // Вертаем исходное название });

Пример может быть не корректен но тут показано как можно блокировать чтоли бо с помощью спец комманд думаю к своему примеру вы сами подставите правильное значение

Источник

Как заставить кнопку в JavaFX ничего не делать?

Имеется кнопка, которая обрабатывает более-менее весомое по времени событие. В моем случае, она в JavaFX приложении при нажатии каждый раз отображает новую капчу. К кнопке привязан метод типа onAction из контроллера, в нем все это происходит. Я хочу, чтобы если я нажимал на кнопку один раз, а потом сразу же второй, то пока метод после первого нажатия еще не завершит свою работу, второй метод не вызывался. Допустим, в самом конце метода я вывожу в консоль слово «конец», и нужно, чтобы я мог нажимать на кнопку сколько угодно раз, пока не увижу это слово, и чтобы при этом ничего не происходило. Я пробовал по классике поставить флаг, типа в начале метода сделать
if (buttonIsPressed) return;
И после него buttonIsPressed = true а в конце всего buttonIsPressed = false
Но это не помогло. Я так понимаю, что эти методы имеют свойство как бы накапливаться, может добавляются в очередь, а потом исполняются один за другим, и вот сколько раз я нажму на кнопку, столько раз метод потом будет срабатывать. Если я нажимал на кнопку 10 раз за пару секунд, то по после того, как я закончил клацать, картинка капчи еще раз 5 поменялась, и продолжалось это длиться тоже где-то пару секунд, короче нежелательно, чтобы такое происходило. Я пишу приложение для себя, в целях изучения, то есть можно и так оставить, но душа хочет чтобы было идеально

Какие тут могут быть методы решения? Я подумал, что может быть нужно как-то создавать второй поток, и тогда все будет выполняться одновременно, параллельно, а не последовательно, а может просто поставить какую-то задержку, таймер на кнопку между нажатиями, но не знаю как это все реализовать. А может быть в JavaFX уже есть готовый какой-нибудь объект, метод, который мне поможет, и не нужно ничего придумывать? Не знаю

Читайте также:  Drag an element javascript

Средний 10 комментариев

maly222

public void action() throws InterruptedException

После вывода текста в консоль, я жму на кнопку 5 раз, до того как тред засыпает на 5 секунд (имитация длительного выполнения кода). После того, как он просыпается, все мои 5 нажатий все равно обрабатываются. Я накликал по кнопке в тот момент, когда выполнялся метод, и после него будут выполняться остальные методы, то есть еще 5 раз выведется слово action в консоль, хотя тред в момент кликов, казалось бы, ничего не обрабатывал
Как сделать так, чтобы пока выполняется код (в данном случае, пока выполняется Thread.sleep), я нажимал на кнопку сколько угодно раз, и после того, как код первого нажатия, первого метода закончил выполняться (тред проснулся), у меня не выполнялись новые методы action() и не выводился текст?

sergueik

azerphoenix

А вы пробовали просто отключать кнопку (деактивировать, сделать некликабельной) ее, пока выполняется некая операция?
https://stackoverflow.com/questions/17871329/disab.
А когда операция завершится включите кнопку.

sergueik

Орхан Гасанлы, мне предлагали это решение в ответах, я попробовал и в комментах написал что это не сработало, в итоге ответ удалили. Ни флаг ни setDisable у меня не работают.
После button.setDisable(true) я вывожу в консоль button.isDisable и выводится true. Затем тред засыпает, я в это время спамлю кнопку и она все равно нажимается, после того как тред просыпается все эти true выводятся

сергей кузьмин, я попробовал это
Сначала я сделал без runLater. Нажатие на кнопку вызывает метод action внутри контроллера:

public void action() throws InterruptedException < MyThread mt = new MyThread(); Thread thread = new Thread(mt); thread.start(); >class MyThread implements Runnable < @Override public void run() < buttonClicked(); >>

И все прекрасно работает. Я добился того, чего нужно. В buttonClicked в начале и конце я меняю button.setDisable на true и false соответственно. И когда я делаю клики, кнопка не реагирует на них, пока buttonClicked() не завершит работу
Но проблема в том, что после первого нажатия у меня только один раз выскакивает
Exception in thread «Thread-3» java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
Естественно исключение это плохо, от него нужно избавляться, для этого как раз в гугле говорят использовать Platform.runLater(). Таким образом, я переделал метод run()

@Override public void run() < Platform.runLater( () ->buttonClicked() ) ; >

После него исключения не возникает, но код не работает так, как работал без runLater. Я снова могу нажимать на кнопку сколько угодно раз и нажатия будут как бы накапливаться, пока все методы, которые нажатие вызвало, не выполнятся

Читайте также:  Html hide link in status bar

sergueik

sergueik

Алексей, кстати создайте проект посмотреть на гитхбе — у меня был один вялотекущий я бы мульт кнопку туда вброил на будущее

Благодаря комментам под вопросом и некоторому гуглению разобрался что к чему. Я решил проблему путем создания нового потока. Таким образом, поток будет работать параллельно с основным потоком. И в то время пока кнопка существует, параллельно и независимо другой поток может ей управлять. При нажатии на кнопку я вызываю метод onAction(), в котором создаю новый поток с точкой входа в виде метода, который все должен обрабатывать

public void onAction() throws InterruptedException

Далее делаем в этом методе все, что хотели делать, но при этом, пока выполняется код, делаем кнопку неактивной: button.setDisable(true). Благодаря этому она меняет цвет и пропадает возможность по ней кликать (также вроде можно модифицировать ее стиль в этом состоянии в css файле: .button:disabled)

Это решение у меня работало нормально и так, как я хотел. Но оно вызывает исключение, хотя на него можно забить если обернуть в try catch, все равно будет работать:
Exception in thread «Thread-3» java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
Я считаю, что хороший программист должен с исключениями бороться 🙂
Как я понял, исключение выбрасывается тогда, когда меняется вид (UI), элементы (узлы) (node) приложения. Видимо, это можно делать только в FX applicaton thread. В моей программе я изменял текстовое поле и поле с изображением. И решение есть — делать все эти изменения с помощью Platform.runLater(). В него, так же как и при создании Thread, передается объект типа Runnable. Runnable — это функциональный интерфейс, поэтому вместо того, чтобы создавать целый класс, реализующий Runnable, для краткой записи воспользуемся лямбда-выражениями. В моем случае для моего приложения метод будет выглядеть примерно так:

public void someMethod() < button.setDisable(true); //some code Platform.runLater( () ->textField.setText(text) ); //some code Platform.runLater( () -> imageView.setImage(image) ); //some code button.setDisable(false); >

Интересно, что setDisable() по идее тоже нужно оборачивать в Platform.runLater(). Но я протестировал, программа срабатывала без исключений даже если не обернуть, хотя казалось бы, этот метод заставляет кнопку менять цвет и делает ее неактивной, некликабельной, меняет состояние кнопки (кстати узнать это состояние можно с помощью isDisabled()), но нет, все работает

Источник

Блокирование и разблокирование пунктов меню

Блокирование и разблокирование пунктов меню

Бывают случаи, когда некоторые пункты меню должны выбираться лишь в определенных ситуациях. Например, если документ открыт лишь для чтения, то пункт меню Save не имеет смысла. Разумеется, этот пункт можно удалить с помощью JMenu.remove(), но пользователя может удивить постоянно изменяющееся меню. Лучше все же заблокировать пункты меню, временно лишив пользователя возможности выполнять ряд операции.

Читайте также:  Node html to image

Чтобы разблокировать или заблокировать пункт меню, используется метод setEnabled():

Существуют две стратегии блокирования и разблокирования пунктов меню. При каждом изменении состояния программы можно вызывать метод setEnabled(), применяя его к соответствующему пункту меню. Например, открыв документ только для чтения, можно заблокировать Save и Save as. Однако, пользуясь этой стратегией, программист рискует засорить код фрагментами, предназначенными для изменения состояния пунктов меню. Гораздо лучше совсем не беспокоиться о состоянии пунктов меню в основной части программы и задавать их параметры непосредственно перед отображением на экране.

Для этого нужно зарегистрировать обработчик событий, связанных с выбором меню. В пакете javax.swing.event содержится интерфейс MenuListener, в котором объявлены три метода:

  • void menuSelected(MenuEvent event)
  • void menuDeselected(MenuEvent event)
  • void menuCanceled(MenuEvent event)

Метод menuSelected() вызывается перед отображением меню на экране. Это самый подходящий момент для того, чтобы заблокировать или разблокировать пункты меню. В приведенном ниже фрагменте кода показано, как блокируются и разблокируются пункты пункты Save и Save As, в зависимости от состояния флажка Read Only.

Источник

Блокировка нажатий клавиш на клавиатуре

Как с помощью средств awt и swing или иных средств java сделать так чтобы при нажатии всех клавиш на клавиатуре кроме букв и цифр, ничего не происходило, чтобы нажатие блокировалось?

Эмуляция нажатий Медиа клавиш клавиатуры
Добрый день. Написал небольшое клиент серверное приложение на сокетах, в котором сервер.

Подсчет нажатий клавиш на клавиатуре
Приветствую. Понадобилось сделать сабж, но дело тут вот в чем. Счетчик должен плюсовать только.

Обработка нажатий клавиш на клавиатуре
Здравствуйте. Как правильно обрабатывать нажатия клавиш на клавиатуре? Читаю Горнакова С.Г. -.

Обработка нажатий клавиш на клавиатуре в языке Pascal
Обработка нажатий клавиш на клавиатурев языке Pascal. Приведите пример обработки нажатия 3-х клавиш.

Если вопрос касается того, как в swing компонент (например в JTextField) передавать нажатие только определенных клавиш, то то для этого используем DocumentFilter.
Так привязываем фильтр к JTextField

((PlainDocument) numbField.getDocument()).setDocumentFilter(new DigitFilter());

А так выглядит класс для реализации фильтра.

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
//можно вводить только цифры public class DigitFilter extends DocumentFilter { private static final String DIGITS = "\\d+"; @Override public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { if (string.matches(DIGITS)) { super.insertString(fb, offset, string, attr); } } @Override public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String string, AttributeSet attrs) throws BadLocationException { if (string.matches(DIGITS)) { super.replace(fb, offset, length, string, attrs); } } @Override public void remove (DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException { super.remove(fb, offset, length); } }

Источник

Оцените статью