2013-12-06 4 views
0

Я хотел бы знать, как поставить JLabel поверх другого JLabel в определенной позиции в классе, который расширяет JPanel на Java. Люди просили об этом, но решения, которые я нашел, не удовлетворяют меня. Я использую GridLayout, вот некоторые из моего кода:Ввод JLabel поверх JLabel в Java

//imports 

public class Game extends JPanel implements MouseListener { 

    Icon background = new ImageIcon(getClass().getResource("/background.jpg")); 
    Icon foreground = new ImageIcon(getClass().getResource("/foreground.jpg")); 
    JLabel backgr = new JLabel(background); 
    JLabel foregr = new JLabel(foreground); 
    JFrame frame = new JFrame("Game"); 

public Game() { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new GridBagLayout()); 
     backgr.addMouseListener(this); 

     frame.setLayout(new FlowLayout()); 
     frame.setPreferredSize(new Dimension(200,200)); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.addMouseListener(this); 
     backgr.setLayout(new BorderLayout()); 
     frame.add(backgr); 
     backgr.add(foreground); 
    } 
} 

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

В настоящее время код почти работает так, как я хочу, изображение переднего плана отображается поверх фона, прямо посередине его. Но я хотел бы, чтобы изображение переднего плана отображалось в определенных координатах на фоновом изображении. Я думал, что если бы я хотел отобразить передний план в координатах (50, 50), я мог бы сказать backgr.add (foreground, 50,50), это компилируется, но возвращает ошибку при запуске программы. Какие-нибудь советы о том, что делать? Было бы очень благодарно.

Edit: я обнаружил, что, говоря backgr.setLayout (нуль), backgr.add (foregr), а затем foregr.setLocation (50,50), мы можем сделать то, что я искал. Но так как не использовать диспетчер компоновки не рекомендуется, я ищу лучшие решения, так что я могу использовать координаты на значке backgr.

+0

какая ошибка возвращается? – Prasad

+0

@Prasad "Исключение в потоке" AWT-EventQueue-0 "java.lang.IllegalArgumentException: незаконная позиция компонента." Независимо от того, какие координаты я выбираю, я получаю это, я предполагаю, что это неправильный путь. – Sid

+0

Прочитайте API, этот метод НЕ используется для указания координат X/Y. – camickr

ответ

4

Люди обратились за помощью с этим раньше, но решения, которые я нашел, не удовлетворяют со мной, так как они требуют от меня, чтобы установить расположение фрейма NULL, но я использую GridBagLayout

рамы использует GridBagLayout.

Вы добавляете передний план JLabel, поэтому фон JLabel. Метка фона может использовать любой макет (включая нуль), который вы хотите.

изображение переднего плана отображается поверх фона, прямо посередине его.

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

+0

Итак, я говорю backgr.setLayout (null) сначала?Затем, если я хочу отобразить изображение переднего плана по координатам (50,50), скажем, backgr.add (передний план, 50,50)? Я просто попробовал это, и у меня все еще есть ошибка, я что-то делаю неправильно? – Sid

+0

@ Сид, я думал, вы сказали, что нашли публикации, которые показывают вам, как использовать нулевой макет? – camickr

+0

Да, я сказал, что понял, что я неясен. Эти публикации показывают, как отображать JLabel поверх другого JLabel, но не как это делать с определенными координатами. Я могу перефразировать мой пост. Но знаете ли вы, как это сделать? – Sid

Смежные вопросы