Java запретить нажатие кнопки

как запретить пользователю нажимать кнопку после нажатия другой кнопки?

Я новичок в программировании на Android и создаю приложение для викторины, в котором вопрос имеет 4 варианта, и если пользователь нажимает на один из вариантов, другие варианты должны быть неактивными. В настоящее время я могу сделать только одну кнопку неактивной. Вот код Java.

package com.example.android.quiz; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >//This method is called when option 1 of question 1 is selected public void verifyQuestion1Option1(View view) < Button QuestionOption1 = (Button) findViewById(R.id.question1_option1); QuestionOption1.setBackgroundColor(getResources().getColor(R.color.solid_red)); question1Answer(); >public void verifyQuestion1Option2(View view) < Button Question1Option2 = (Button) findViewById(R.id.question1_option2); Question1Option2.setBackgroundColor(getResources().getColor(R.color.solid_red));//solid red is not a predefined colour. It is declared in colors.xml question1Answer(); >public void verifyQuestion1Option3(View view) < Button Question1Option3 = (Button) findViewById(R.id.question1_option3); Question1Option3.setBackgroundColor(getResources().getColor(R.color.solid_green)); question1Answer(); >public void verifyQuestion1Option4(View view) < Button Question1Option4 = (Button) findViewById(R.id.question1_option4); Question1Option4.setBackgroundColor(getResources().getColor(R.color.solid_red));//We call the getResources() method because R.colour.solid_red passed the id of the color not the actual colour value. question1Answer(); >public void question1Answer() < TextView q1Answer = (TextView) findViewById(R.id.question1_answer); String answer = "Rajinish Kumar is the current Chairman of SBI who took over after Arundhati Bhattacharya retired on 6 October.Shikha Sharma is the Managing Director and CEO of Axis Bank and Chanda Kochhar is the managing director and CEO of ICICI Bank"; q1Answer.setText(answer); >> 

2 ответа

Вы можете использовать .setEnabled(false); , чтобы отключить кнопку. Эта кнопка станет серой и больше не будет реагировать на события нажатия.

Читайте также:  Python working with files and directories

Чтобы отключить все кнопки, возьмите дескриптор каждой кнопки и отключите их.

Button Question1Option1 = (Button) findViewById(R.id.question1_option1); Button Question1Option2 = (Button) findViewById(R.id.question1_option2); Button Question1Option3 = (Button) findViewById(R.id.question1_option3); Button Question1Option4 = (Button) findViewById(R.id.question1_option4); Question1Option1.setEnabled(false); Question1Option2.setEnabled(false); Question1Option3.setEnabled(false); Question1Option4.setEnabled(false); 

Таким образом, все кнопки этого вопроса станут недоступными. Вы также можете предложить решение, в котором вы сохраняете, что кнопка уже нажата, и игнорируете дальнейшие события щелчка. Вы можете ввести какую-то переменную bool question1answered = false; , для которой устанавливается значение true, как только запускается событие onClick.

public void verifyQuestion1Option4(View view) < if (question1Answered == true) question1Answered =true; //Do the rest of your checks here > 

Два совета по программированию на Java:

  1. Java (в отличие от C #) в качестве соглашения использовала строчные переменные. Button question1Option1 = (Button) findViewById(R.id.question1_option1); было бы лучше.
  2. Если у вас есть дополнительные вопросы, имеет смысл поместить их в какой-то массив и повторно использовать одни и те же четыре кнопки несколько раз. Это сэкономит вам много накладных расходов на программирование и переписывает код, если вам нужно что-то изменить. И это сохраняет код более чистым.

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

Чтобы отключить кнопку, вы можете использовать следующий код:

Button button = (Button) findViewById(R.id.button); button.setEnabled(false); 

Источник

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

Написал программу Апплета на 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 уже есть готовый какой-нибудь объект, метод, который мне поможет, и не нужно ничего придумывать? Не знаю

Средний 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. Я снова могу нажимать на кнопку сколько угодно раз и нажатия будут как бы накапливаться, пока все методы, которые нажатие вызвало, не выполнятся

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()), но нет, все работает

Источник

Как сделать паузу — запретить нажатие кнопок на 5 секунд?

Принцип игры — вопросы на время.
По кнопке «Старт» запускается таймер обратного отсчета, кнопка превращается в «Далее» и, пока работает таймер, нажимается несколько раз, отображая следующий вопрос. По завершении таймера кнопка делается обратно в «Старт» и можно начинать следующий раунд игры. Нужно выдержать паузу в несколько секунд, чтобы по завершении времени случайно не нажать на запуск следующего раунда, чтобы обсудить результаты.
Делаю так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// стоп таймер btStart.setVisibility(View.INVISIBLE); //прячем кнопку старт playSound(SoundEndTimer); mVibrator.vibrate(300); StopRound(); } public void StopRound(){ btStart.setText("Старт"); NewRoundPause = true; try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } btStart.setVisibility(View.VISIBLE); NewRoundPause = false; public void btStart_Click(View v){ if (NewRoundPause) return; // и т.д. }

В итоге кнопка не прячется, на нажатия в течении 5 сек не реагирует, зато потом стартует столько раз, сколько было нажатий в момент паузы.
Как победить?

Источник

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