Как заставить функцию ждать нажатия JButton на Java? [Дубликат]

Точно вычислять нормальную высоту линии в пикселе сложно. Хотя, согласно MDN , это примерно 1.2em.

Если вы:

  body {font-size: 16px;  }  

Итак, ваш сайт имеет нормальный размер шрифта как 16px, тогда нормальная высота линии будет примерно 24px . Это означает, что вы можете рассчитать нормальное значение размера шрифта, умноженное на 1.5 , которое равно 16px * 1.5 == 24px

Примечание: я не умножал на 1.2, потому что существует разница между значением px и значением em.

0
задан assylias 27 March 2013 в 20:46
поделиться

3 ответа

Если вы используете качели, вы уже используете потоки. Swing по своей природе имеет поток для ввода-вывода и поток для back-end. Вы действительно хотите использовать потоки здесь - среди прочего, поставить поток в ожидании намного дешевле, чем дать ему бесконечный цикл, чтобы отменить.

Слушатели - это еще одно приложение потоков, и я не удивлюсь, если вы сможете получить большинство или все то, что вы хотите, просто используя хорошо построенные слушатели. Кроме того, эти вещи называются семафорами. Семафоры - это способ для потоков обрабатывать синхронизацию - если поток пытается заблокировать семафор, который уже заблокирован, он будет ждать, пока другой поток не разблокирует его, прежде чем продолжить (и снова заблокировать его). В вашем случае вы можете попробовать следующее.

  • У вас есть прослушиватель кнопок, основная функция и заблокированный семафор.
  • Запускается основная функция, происходит ли какое-либо начальное поведение, и пытается захватить семафор. поскольку семафор уже заблокирован, он удерживается.
  • Когда запускается кнопка прослушивателя, одна из вещей, которые она делает, - это разблокировать семафор.
  • Как только разблокируется семафор, основной функция захватывает его (тем самым блокируя его еще раз) и делает все, что он должен делать. В конце концов, он завершает это и пытается снова захватить (заблокированный) семафор, ожидая при следующем запуске кнопки прослушивания кнопки
  • .

Изменить: Включить и объяснить фактическое принятое решение (из комментариев ниже).

Исправить: добавить Thread.sleep(1000); во внутреннюю часть цикла while в функции whileConnected.

Объяснение: Время loop - это бесконечный цикл, который содержит только инструкцию if. Этот оператор if оценивает значение false (и, следовательно, ничего не делает) в течение очень долгого времени (по крайней мере, в отношении компьютера). Это действует точно так же, как это делает электрический штекер - нет ничего, чтобы замедлить его, поэтому поток, который запускает эту главную функцию, сжигает множество вычислительных ресурсов, ничего не делая. Это плохо. Возможно, что некоторые отказоустойчивые пинают и убивают нить. Вполне возможно, что поток потерпел неудачу или сломал что-то более уродливым образом. В любом случае, включая оператор сна (в этом случае спать на секунду каждый цикл, так как он измеряется в мс) предотвращает это, и, таким образом, позволяет продолжать функционировать бесконечно.

2
ответ дан Ben Barden 16 August 2018 в 06:42
поделиться
  • 1
    «Я бы не удивился, если бы вы могли получить больше всего или всего того, что хотите, просто используя хорошо построенные слушатели». Не могли бы вы немного рассказать об этом? (Я ценю детали семафора, но на данный момент это слишком сложно для меня, и это школьный проект, который мне нужно решить довольно скоро, поэтому я с радостью пойду на самое простое решение прямо сейчас) – x x 27 March 2013 в 22:12
  • 2
    Ну, похоже, что вам нужно что-то, что будет реагировать соответствующим образом на нажатия кнопок. У вас есть прослушиватель кнопок, который выполняет код на основе нажатия кнопок. Вместо того, чтобы что-то выполнять в основной функции, вы могли бы просто сделать все, что вам нужно сделать изнутри слушателей. Имейте в виду, что слушатели работают в том же потоке, что и пользовательский интерфейс, поэтому, если там много обработки, вы можете столкнуться с некоторым неприятным замедлением, но это должно сработать. К сожалению, если ваше название вопроса является прямой цитатой из вашего задания, семафоры, вероятно, то, что они ищут. – Ben Barden 27 March 2013 в 22:16
  • 3
    docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/… может быть полезно здесь, если вам нужно использовать семафоры. – Ben Barden 27 March 2013 в 22:20
  • 4
    Да, но мой вопрос, действительно, как я могу «почувствовать»? изнутри цикла while (true) в функции whileConnected (), что «сообщение» больше не пусто («& quot;») (т. е. нажата кнопка). Есть ли способ? – x x 27 March 2013 в 22:24
  • 5
    Я бы сказал, сначала попробую установить его на что-то непустое. Если «Сообщение сначала пусто», строка включает в себя начальное сообщение, как предполагалось, тогда вы, вероятно, столкнетесь с каким-то механизмом, предназначенным для предотвращения бесконечных циклов (или, возможно, каким-то образом запуском самого бесконечного цикла). Если это проблема, вы можете попробовать включить Thread.sleep(1000); в свой цикл while (заставляет его ждать вторую промежуточную проверку - экономит вычислительные ресурсы). – Ben Barden 27 March 2013 в 22:44

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

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

Прошли ли вы через Java-учебники по oracle для Swing? Большинство ссылок были бы примерами в http://docs.oracle.com/javase/tutorial/uiswing/events/index.html для прослушивателей и http://docs.oracle.com /javase/tutorial/uiswing/concurrency/index.html для WorkerThreads

Я нашел с Swing, что лучше всего скачать примеры здесь и попытаться расширить их

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

0
ответ дан Causteau 16 August 2018 в 06:42
поделиться
  • 1
    Я полагаю, вы имели в виду, что вы согласились со мной. Ассилиас отредактировал сообщение, но не ответил на него выше этого. Кроме того, добро пожаловать в переполнение стека. :) – Ben Barden 27 March 2013 в 21:41
  • 2
    Упс! Спасибо, Бэн :) – Causteau 27 March 2013 в 21:54

Swing, как и большинство графических интерфейсов GUI, является средой, управляемой событиями. В основном это означает, что приложение будет ожидать какого-либо события, а затем вызовет любые зарегистрированные слушатели, которые ждут уведомления для этого события.

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

Отъезд Как написать прослушиватели действий для получения дополнительной информации.

Swing также представляет собой однострочную обрамленную резьбу. То есть, все взаимодействие с пользовательским интерфейсом должно выполняться из контекста потока Dispatching Event.

Это также означает, что любая длительная или блокирующая задача ДОЛЖНА выполняться из отдельного потока, чтобы не заблокировать EDT от обработки входящих событий и повторного запроса, что может заставить приложение выглядеть так, как если бы оно зависло.

Проверьте Параллельность в Swing для более подробной информации

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

Основной концепцией было бы, если у игрока нет токена, они не могут сделать ход. Когда игрок делает ход, этот ход и токен отправляются другому игроку.

2
ответ дан MadProgrammer 16 August 2018 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: