JLabel在另一个JLabel之上?

时间:2014-05-10 13:22:26

标签: java swing jlabel

我目前正在尝试将tabIconLabels(它们是JLabel)放在更大的JLabel(tabAreaLabel)上(所有标签都附加了一个ImageIcon)。我尝试过使用OverlayLayout但tabIconLabels的位置不在正确的位置。我也尝试将tabAreaLabel的LayoutManager设置为null,然后为所有tabIconLabel设置setBounds方法,但这也不起作用。 tabIconLabels只是一个随机位置,我不知道为什么。我也希望不使用g.drawImage方法,因为我希望在不久的将来删除JLabel。

public GamePanel(final Player player) {
    super(null);
    this.setMemory(Memory.LOW);
    this.setRevisionType(RevisionType.THREE_ONE_SEVEN);
    this.setPlayer(player);
    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    this.requestFocusInWindow();
    this.setFocusable(true);
    final ChatBox chatBox = this.getPlayer().getChatBoxSystem().getChatBox();
    final MapArea mapArea = this.getPlayer().getMapSystem().getMapArea();
    final TabArea tabArea = this.getPlayer().getTabAreaSystem().getTabArea();
    // final Compass compass = this.getPlayer().getCompass();
    final JLabel chatBoxLabel = chatBox.getImageLabel();
    this.add(chatBoxLabel);
    final JLabel mapAreaLabel = mapArea.getImageLabel();
    this.add(mapAreaLabel);
    final JLabel tabAreaLabel = tabArea.getImageLabel();
    this.add(tabAreaLabel);
    chatBoxLabel.setBounds(chatBox.getLocation().getX(), chatBox.getLocation().getY(), 519, 165);
    mapAreaLabel.setBounds(mapArea.getLocation().getX(), mapArea.getLocation().getY(), 246, 168);
    tabAreaLabel.setBounds(tabArea.getLocation().getX(), tabArea.getLocation().getY(), 250, 338);
    final short[] xLocation = {
            549, 574, 605, 635, 673, 704, 730, 577, 605, 637, 674, 705, 732
    };
    final short[] yLocation = {
            176, 175, 175, 173, 175, 175, 175, 471, 471, 472, 470, 470, 470
    };
    final short[] width = {
            20, 25, 22, 30, 25, 24, 24, 24, 24, 27, 26, 19, 20
    };
    final short[] height = {
            19, 24, 23, 29, 28, 27, 24, 23, 23, 24, 27, 24, 25
    };
    for (byte b = 0; b < 13; b++) {
        final JLabel tabIconLabel = tabArea.getTabs()[b].getTabIcon();
        tabAreaLabel.setLayout(new OverlayLayout(tabAreaLabel));
        // tabAreaLabel.setLayout(null);
        tabAreaLabel.add(tabIconLabel);
        tabIconLabel.setBounds(xLocation[b], yLocation[b], width[b], height[b]);
    }}

感谢您的帮助!附:我无法让代码正确地适合代码标记。最后一个括号应该在下一行,而不是在倒数第二个括号旁边。

http://i.stack.imgur.com/OFkKg.png

2 个答案:

答案 0 :(得分:2)

tabAreaLabel.setBounds(tabArea.getLocation().getX(), tabArea.getLocation().getY(), 250, 338);

tabAreaLabel的大小为(250,338)。

short[] xLocation = {
    549, 574, 605, 635, 673, 704, 730, 577, 605, 637, 674, 705, 732
};

所有标签的x位置都大于250,因此它们不适合标签。修复坐标或修复tabAreaLabel的大小。

通常,您不应该硬编码图像的大小。相反,你可以使用类似的东西:

tabAreaLabel.setSize( tabAreaLabel.getPreferredSize() );
tabAreaLabel.setLocation(...);

另外,不要使用short []数组。使用int []数组。

与循环相同:

for (byte b = 0; b < 13; b++) {

不要使用byte,只需使用int。

答案 1 :(得分:0)

你想要的是Swing的OverlayLayout。这应该使您能够分层组件。

http://docs.oracle.com/javase/7/docs/api/javax/swing/OverlayLayout.html