Точно вычислять нормальную высоту линии в пикселе сложно. Хотя, согласно MDN , это примерно 1.2em.
Если вы:
body {font-size: 16px; }
Итак, ваш сайт имеет нормальный размер шрифта как 16px, тогда нормальная высота линии будет примерно 24px
. Это означает, что вы можете рассчитать нормальное значение размера шрифта, умноженное на 1.5
, которое равно 16px * 1.5 == 24px
Примечание: я не умножал на 1.2, потому что существует разница между значением px и значением em.
Если вы используете качели, вы уже используете потоки. Swing по своей природе имеет поток для ввода-вывода и поток для back-end. Вы действительно хотите использовать потоки здесь - среди прочего, поставить поток в ожидании намного дешевле, чем дать ему бесконечный цикл, чтобы отменить.
Слушатели - это еще одно приложение потоков, и я не удивлюсь, если вы сможете получить большинство или все то, что вы хотите, просто используя хорошо построенные слушатели. Кроме того, эти вещи называются семафорами. Семафоры - это способ для потоков обрабатывать синхронизацию - если поток пытается заблокировать семафор, который уже заблокирован, он будет ждать, пока другой поток не разблокирует его, прежде чем продолжить (и снова заблокировать его). В вашем случае вы можете попробовать следующее.
Изменить: Включить и объяснить фактическое принятое решение (из комментариев ниже).
Исправить: добавить Thread.sleep(1000);
во внутреннюю часть цикла while в функции whileConnected.
Объяснение: Время loop - это бесконечный цикл, который содержит только инструкцию if. Этот оператор if оценивает значение false (и, следовательно, ничего не делает) в течение очень долгого времени (по крайней мере, в отношении компьютера). Это действует точно так же, как это делает электрический штекер - нет ничего, чтобы замедлить его, поэтому поток, который запускает эту главную функцию, сжигает множество вычислительных ресурсов, ничего не делая. Это плохо. Возможно, что некоторые отказоустойчивые пинают и убивают нить. Вполне возможно, что поток потерпел неудачу или сломал что-то более уродливым образом. В любом случае, включая оператор сна (в этом случае спать на секунду каждый цикл, так как он измеряется в мс) предотвращает это, и, таким образом, позволяет продолжать функционировать бесконечно.
Я думаю, что по определению игра приостанавливается до нажатия кнопки, так как 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, что лучше всего скачать примеры здесь и попытаться расширить их
Я согласен с Бен Барденом, хотя, исходя из моего понимания того, что вам нужно, я думаю, вы можете добиться того, что вам нужно, используя слушателей.
Swing, как и большинство графических интерфейсов GUI, является средой, управляемой событиями. В основном это означает, что приложение будет ожидать какого-либо события, а затем вызовет любые зарегистрированные слушатели, которые ждут уведомления для этого события.
В вашем случае вам просто нужно зарегистрировать AdtionListener
к кнопке. Когда пользователь нажимает на нее (или активируется с клавиатуры), будет вызываться метод actionPerformed
, и вы можете выполнить любой код, который вам нужен.
Отъезд Как написать прослушиватели действий для получения дополнительной информации.
Swing также представляет собой однострочную обрамленную резьбу. То есть, все взаимодействие с пользовательским интерфейсом должно выполняться из контекста потока Dispatching Event.
Это также означает, что любая длительная или блокирующая задача ДОЛЖНА выполняться из отдельного потока, чтобы не заблокировать EDT от обработки входящих событий и повторного запроса, что может заставить приложение выглядеть так, как если бы оно зависло.
Проверьте Параллельность в Swing для более подробной информации
На мой взгляд, вашему игровому протоколу потребуется какой-то способ отслеживания, чей круг он есть. Это было бы достигнуто просто с использованием виртуального токена.
Основной концепцией было бы, если у игрока нет токена, они не могут сделать ход. Когда игрок делает ход, этот ход и токен отправляются другому игроку.
Thread.sleep(1000);
в свой цикл while (заставляет его ждать вторую промежуточную проверку - экономит вычислительные ресурсы). – Ben Barden 27 March 2013 в 22:44