2015-10-14 4 views
0

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

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

[только разделы моего кода]

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); 

    } 
} 

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

EDIT

Я сделал класс, который расширяет 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); 

    } 
} 

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

ответ

3

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

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

Label overlay

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(); 
      } 
     } 

    } 

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