Наличие JLabel поверх другого JLabel с изображением

Итак, я пытаюсь сделать настольную игру с графическим интерфейсом. Я создал JLabel с именем игрока и хочу использовать его как токен. Затем я сделал еще одну JLabel, содержащую изображение платы. Я добавил обе метки на панель boardPanel, и сейчас они расположены рядом. Как мне сделать так, чтобы вместо того, чтобы быть рядом, JLabel с именем находился на JLabel с img?

Есть ли что-то, что я должен рассмотреть для панели, содержащей две метки? Как определенный менеджер макетов?

[только части моего кода]

import java.awt.*;
import javax.swing.*;

public class BoardFrame extends JFrame {

   private JPanel mainPanel, boardImgPanel,jPanelSouth,buttonPanel
           ,cardPanel,statsPanel;
   private boardImgLabel;

   Player player1;

   public BoardFrame() {
      //boardPanel and stuff in it
      boardImgPanel = new JPanel();
      boardImgLabel = new JLabel();
      boardImgLabel.setIcon(new ImageIcon("BOARDPICTUREHERE"));
      boardImgPanel.add(boardImgLabel);

      /////////////////////ADDING PLAYERS/////////////////////
      player1 = new Player("Steven", 1,1,1,1,1);
      JLabel player1Label = new JLabel(player1.getPlayerName());
      boardImgPanel.add(player1Label);

      mainPanel = new JPanel(new GridLayout(0, 1));

      add(mainPanel);

   }
}

что-то вроде этого, но явно вместо кота это изображение доски, а текст - это имя игрока.

ИЗМЕНИТЬ

Я создал класс, который расширяет jpanel, а затем хотел добавить его в класс BoardFrame.

import java.awt.BorderLayout;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BoardPanelNorth extends JPanel {
        File imageFile = new File("....");

        JLabel boardImgLabel = new JLabel();
        Player player1;

        public BoardPanelNorth() {
            setLayout(new BorderLayout());
            try {
                boardImgLabel = new JLabel(new ImageIcon(ImageIO.read(imageFile)));
                boardImgLabel.setLayout(new BorderLayout());

                player1 = new Player("Steven", 1,1,1,1,1);
                JLabel player1Label = new JLabel(player1.getPlayerName());
                player1Label.setFont(player1Label.getFont().deriveFont(128f));
                player1Label.setHorizontalAlignment(JLabel.RIGHT);
                player1Label.setVerticalAlignment(JLabel.BOTTOM);
                player1Label.setForeground(Color.WHITE);

                add(boardImgLabel);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

}

Класс рамы платы:

import java.awt.*;
import javax.swing.*;

public class BoardFrame extends JFrame {

   private JPanel mainPanel, boardImgPanel;
   private JSplitPane splitPane;

   public BoardFrame() {

      boardImgPanel = new BoardPanelNorth();


      //split plane
      splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
         new JScrollPane(boardImgPanel), jPanelSouth);
      splitPane.setDividerLocation(470); //top size
      splitPane.enable(false); //cant adjust


      mainPanel = new JPanel(new GridLayout(0, 1));
      mainPanel.add(splitPane);

      add(mainPanel);

   }
}

Игрок Стивен по-прежнему не появляется на карте.


person Jake    schedule 14.10.2015    source источник


Ответы (2)


Вы можете использовать OverlayLayout или вы можете просто добавить второй JLabel к первому. Хитрость здесь заключается в том, чтобы настроить менеджер компоновки для первой метки.

Однако будьте осторожны, JLabel использует только свойства icon и text, которые определяют предпочтительный размер макета, что может привести к усечению его дочерних элементов.

Наложение ярлыка

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            try {
                JLabel background = new JLabel(new ImageIcon(ImageIO.read(...)));
                background.setLayout(new BorderLayout());
                JLabel text = new JLabel("I'm just drawn this way");
                text.setFont(text.getFont().deriveFont(128f));
                text.setHorizontalAlignment(JLabel.RIGHT);
                text.setVerticalAlignment(JLabel.BOTTOM);
                text.setForeground(Color.WHITE);

                background.add(text);

                add(background);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }

}
person MadProgrammer    schedule 14.10.2015

я делаю следующий способ в своем проекте с графическим интерфейсом: 1. создайте jPanel с OverlayLayout 2. поместите две jlabels в jPanel 3. создайте keyEvent или что-то в этом роде

введите здесь описание изображения введите здесь описание изображения пример кода моего проекта GUI:

    private void jLabel2KeyPressed(java.awt.event.KeyEvent evt) {
int i = evt.getKeyCode();
  switch (i) {
 // some parts of my code }
if(k5==true&&ke==true&&k1==false&&k3==false) {
jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/audit/images/tie.png")));

 jLabel177.setIcon(new javax.swing.ImageIcon(getClass().getResource("/audit/images/tie1forbigroad.png")));
}
}
person Chauncey Lee    schedule 26.08.2019