我目前正在尝试将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]);
}}
感谢您的帮助!附:我无法让代码正确地适合代码标记。最后一个括号应该在下一行,而不是在倒数第二个括号旁边。
答案 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