2017-02-17 7 views
0

Предположим, я создаю приложение для шахмат с качелями. Я использую массив JLabels для представления шахматной доски (каждый из них имеет соответствующий значок, расположенный как слегка/темный затененный блок). Я создал еще один массив JLabels, чтобы удерживать значки шахматных фигур, но я недостаточно знаком с качелями, чтобы знать, как их реализовать, чтобы отображать поверх шахматной доски. Кто-нибудь знает какие-либо методы?Как показать значок JLabel над другим значком JLabel

+0

'JLabel' это еще один компонент, он способен содержать другие компоненты, но вам нужно будет установить его менеджер компоновки, возможно, используйте 'BorderLayout' – MadProgrammer

+1

Как [пример] (http://stackoverflow.com/questions/33115320/having-a- JLabel-на-топ-другому-JLabel-что-есть-ан-изображения/33115415 # 33115 415) – MadProgrammer

+1

См. Также [Создание надежного масштабируемого графического интерфейса Swing Chess GUI] (http://stackoverflow.com/q/21142686/418556) для начальной точки. –

ответ

0

Я написал небольшой пример, который строит окно и два JLabels поверх друг друга.

Обратите внимание, что в grey.jpg и pawn.png изображения имеют размер 128х128 и пешки один имеет прозрачный фон (таким образом предотвратить фоне пешки изображения из укрытия серый прямоугольник окна).

Вот класс ChessFrame, который строит окно и добавляет компоненты:

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


public class ChessFrame extends JFrame { 

    private JPanel panel; 
    private JLabel greyBox; 
    private JLabel pawn; 


    public ChessFrame() { 
     super(); 

     /* configure the JFrame */ 
     this.setSize(300, 300); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 


    public void addComponents() { 
     panel = new JPanel(); 
     greyBox = new JLabel(new ImageIcon("images/grey.jpg")); 
     pawn = new JLabel(new ImageIcon("images/pawn.png")); 

     /* add the pawn inside the grey box (we have to set a layout for the grey box JLabel) */ 
     greyBox.setLayout(new BorderLayout()); 
     greyBox.add(pawn); 

     /* add grey box to main JPanel and set its background to white so we observe the result better */ 
     panel.add(greyBox); 
     panel.setBackground(Color.WHITE); 

     this.getContentPane().add(panel); 
    } 


    @Override 
    public void setVisible(boolean b) { 
     super.setVisible(b); 
    } 

} 

А вот Основной класс, который создает объект ChessFrame и показывает окно:

public class Main { 

    public static void main(String[] args) { 
     ChessFrame chessFrame = new ChessFrame(); 

     chessFrame.addComponents(); 
     chessFrame.setVisible(true); 
    } 

} 
+0

1) Хотя можно добавлять компоненты к ярлыкам, это имеет недостаток в том, что ярлык больше не может предоставить соответствующий предпочтительный размер менеджеру компоновки. Лучшим подходом было бы установить цвет BG на метку, на которой отображается значок, или панель, в которую добавлена ​​метка. 2) Один из способов получить изображение (-ы) для примера - это горячая ссылка на изображения, видимые в [этом Q & A] (http://stackoverflow.com/q/19209650/418556). –

+0

Пошел с этой реализацией, потому что Брайан спросил о JLabels поверх JLabels :), поэтому я хотел пойти по тому же пути, что и вопрос. Кроме того, спасибо за предложение с помощью горячих ссылок на изображения. – Valy

+1

* «Я хотел идти по тому же пути, что и вопрос». * См. [Является ли «Не делай этого» действительного ответа?] (Http://meta.stackexchange.com/questions/8891/is-dont -do-это-а-действительный-ответ). (Да, конечно, если ОП принимает неверный подход и есть лучшее решение.) Конкретные примеры можно увидеть в моем комментарии по этому вопросу (комментарий в ответ на сам вопрос), а также [мой ответ ] (http://stackoverflow.com/a/42312098/418556) в [Перемещение JPanels с использованием TimerTask] (http://stackoverflow.com/q/42310947/418556) - (принятый) ответ не перемещает панели и не использует ' TimerTask'. –

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