Наблюдения (tl; dr)
Проходя через ваш код, возникает ряд проблем, которые могут складываться вместе, вызывая всевозможные проблемы, если не сразу, то в будущем (и какрешение становится более сложным).
Надежность null
макетов
Каждый раз, когда я смотрю в вашем коде, я вижу setLayout(null);
.Это будет преследовать вас, особенно если вы попытаетесь запустить код на разных платформах
Swing, как и большинство достойных UI-фреймворков, имеет встроенную концепцию того, как компоненты должны быть расположены независимо от платформы.
Я бы настоятельно рекомендовал потратить некоторое время на просмотр Размещение компонентов внутри контейнера
Просматривая ваш код, я могу найти хорошие места для использования BorderLayout
, GridBagLayout
, GridLayout
и CardLayout
, которые значительно уменьшат сложность кода и упростят его изменение (при необходимости) и поддержку, а также поддержат различные платформы и конвейеры рендеринга.
Использование JLayeredPane
из JFrame
getLayeredPane().add(gamepage);
... Я не уверен, какую выгоду вы рассчитывали получить, но это очень необычное решение.JLayeredPane
- отличный способ отобразить пользователю информацию о стиле «всплывающих окон» или предоставить «оверлейную» информацию на панели содержимого, но это я.
Суть проблемы
В классе JPicButton
вы реализуете два метода.
/**
* @return the x
*/
public synchronized int getX() {
return x;
}
/**
* @return the y
*/
public synchronized int getY() {
return y;
}
Проблема в том, что эти два метода уже определены JButton
и относятся к месту, в котором кнопка должна быть расположена относительно ее родительского контейнера.,Переопределение этих методов означает, что при использовании setLocation
значения игнорируются.
Поэтому, когда я изменяю ваш код для удаления этих методов, я получаю следующий результат ...
Позиция "x / y", которой вы пытаетесь управлять, должна фактически управляться моделью, графический интерфейс должен просто представлять состояние модели.
Заключительные замечания
Я сделал несколько замечаний о состоянии вашего кода, для меня было бы непрофессионально поступать иначе, поскольку вы копаетесь в бесконечной дырепроблемы с работой и царапинами, которые могут быть легко решены с помощью имеющейся поддержки API.
Я полагаю, однако, что вы хорошо начали попытки решить общую проблему и хотели бы продолжить, нопринимая во внимание некоторые сделанные наблюдения.