В дополнение к предложениям @ Fracool:
Вы делаете:
window.add(new ImagePanel());
, что совпадает с:
window.getContentPane().add(new ImagePanel());
Позже вы делаете:
con = window.getContentPane();
...
con.add(snakeButtonPanel);
Это означает, что вы добавляете «imagePanel» и «snakeButtonPanel» на панель содержимого.
Когда несколько компонентов добавляются на одну панель, последний добавленный компонент окрашивается первым.Таким образом, в этом случае сначала отображается «snakeButtonPanel», а затем «imagePanel».Вы не хотите добавлять два компонента в панель содержимого.Вы хотите иметь родительские / дочерние отношения между фоновым изображением и кнопкой.
Также нет необходимости в «snakeButtonPanel», вы можете напрямую добавить «snakeButton».
Таким образом, вместо такой структуры, как:
- contentPane
-imagePanel
- snakeButtonPanel
- snakeButton
Вы должны иметь такую структуру:
- contentPane
-imagePanel
- snakeButton
И основной код будет выглядеть так:
JButton snakeButton = new JButton(...);
JPanel imagePanel = new ImagePanel();
imagePanel.add( snakeButton );
window.add( imagePanel );
Если вы сохраните менеджер макетов по умолчанию (который является BorderLayout), тогда панель изображений заполнит весь кадр, и кнопка будет расположена на панели изображений в соответствии с правилами FlowLayout, который является менеджером макетов по умолчанию для JPanel..
public class TestingGrounds extends JFrame{
Не расширять JFrame.Вы не добавляете новую функциональность в класс JFrame, и код в вашем конструкторе создает JFrame, то есть фрейм, в который вы добавляете все компоненты.