2012-04-25 43 views
1

我正在试图将JLabel添加到我的健康栏上,该栏是由红色矩形顶部的绿色矩形模拟的。尽管我声明了一个JLabel并将其附加到我的rectangleComponent,但它永远不会显示出来。有任何想法吗? 这是我的rectangleComponent和它被初始化的Frame。在Java中,如何将JLabel添加到矩形?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Rectangle2D; 

import javax.swing.JComponent; 
import javax.swing.JLabel; 

public class RectangleComponent extends JComponent 
{ 
    private Color color; 
    private int width; 
    private int height; 
    private int origWidth; 
    private JLabel label; 
    private Rectangle2D rectangle; 
    private boolean wantLabel; 
    private int xCoord; 
    private int yCoord; 

    public RectangleComponent(int x, int y, Color color, int width, int height, boolean wantLabel) 
    { 
     this.width = width; 
     this.height = height; 
     this.color = color; 
     origWidth = width; 
     xCoord = x; 
     yCoord = y; 
     this.wantLabel = wantLabel; 
     if(wantLabel) 
     { 
      label = new JLabel(this.width + "/" + origWidth); 
      label.setLabelFor(this); 
     } 
     setBounds(xCoord, yCoord, width, height); 
     rectangle = new Rectangle2D.Float(xCoord, yCoord, width, height); 
    } 

    public RectangleComponent(int x, int y, Color color, boolean wantLabel) 
    { 
     width = 125; 
     height = 18; 
     xCoord = x; 
     yCoord = y; 
     this.color = color; 
     origWidth = width; 
     this.wantLabel = wantLabel; 
     if(wantLabel) 
     { 
      label = new JLabel(this.width + "/" + origWidth); 
      label.setLabelFor(this); 
     } 
     setBounds(xCoord, yCoord, width, height); 
     rectangle = new Rectangle2D.Float(xCoord, yCoord, width, height); 
    } 

    public void paintComponent(Graphics g) 
    { 
     Graphics2D graphics2 = (Graphics2D) g; 
     rectangle = new Rectangle2D.Float(xCoord, yCoord, width, height); 
     graphics2.setPaint(color); 
     graphics2.fill(rectangle); 
     graphics2.draw(rectangle); 
     if(wantLabel) 
      label.setText(this.width + "/" + origWidth); 
    } 

    public Dimension getPreferredSize() 
    { 
     return (new Dimension(width, height)); 
    } 

    public void subtractLife(int amount) 
    { 
     width -= amount; 
     if(width > 0) 
     { 
      rectangle.setRect(xCoord, yCoord, width, height); 
      repaint(); 
     } 
     else 
      width = 0; 
    } 

    public void addLife(int amount) 
    { 
     width += amount; 
     if(width < origWidth) 
     { 
      rectangle.setRect(xCoord, yCoord, width, height); 
      repaint(); 
     } 
     else width = origWidth; 
    } 
} 


import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GameFrame extends JFrame 
{ 
    private SpellBarComponent bar; 
    private JPanel mainPanel = new JPanel(); 
    private JPanel buttonPanel = new JPanel(); 
    Color green = new Color(29, 180, 29); 
    Color red = new Color(255, 0, 0); 
    private RectangleComponent life; 
    private RectangleComponent death; 

    public GameFrame(char x) 
    { 
     setSize(1024, 768); 
     setTitle("Game"); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     mainPanel.setLayout(null); 
     createPanels(x); 
     buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 
     repaint(); 
     getContentPane().add(mainPanel, BorderLayout.CENTER); 
     getContentPane().add(buttonPanel, BorderLayout.PAGE_END); 
     setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); 
     setLocationByPlatform(true); 
     life.subtractLife(10); 
     setVisible(true); 

    } 

    public RectangleComponent getLife() 
    { 
     return life; 
    } 

    private void createHealth() 
    { 
     life = new RectangleComponent(0, 0, green, true); 
     death = new RectangleComponent(0, 0, red, true); 
    } 

    private void createPanels(char x) 
    { 
     createBar(x); 
     createHealth(); 
     mainPanel.add(buttonPanel); 
     mainPanel.add(life); 
     mainPanel.add(death); 
     buttonPanel.add(bar.getSpell1()); 
     buttonPanel.add(bar.getSpell2()); 
     buttonPanel.add(bar.getSpell3()); 
    } 

    private void createBar(char x) 
    { 
     bar = new SpellBarComponent(x); 
    } 
} 

回答

4

您错过了在组件中调用add(label)的信息。因此您的标签不附在其上。顺便说一句,我认为它真的被禁止,如果不是禁止的话,修改paintComponent中的标签。您应该在修改widh和/或origWidth时执行该调用。

+0

我打电话给label.setLabelFor(这个),我认为它加了。在我的构造函数中为RectangleComponent调用add(label)并不能解决问题。 – keyert 2012-04-26 20:47:11

+1

@keyert这是因为您扩展了JComponent而没有设置标签边界或设置LayoutManager。你的标签可能有一个宽度和高度为0. RectangleComponent可以扩展JPanel。此外,设置setLabelFor不会将标签添加到组件,这仅用于助记符:http://docs.oracle.com/javase/7/docs/api/javax/swing/JLabel.html#setLabelFor(java。 awt.Component)。最后,不是使用布尔标志来显示或不使用标签,而是使用标签上的setVisible。 – 2012-04-26 22:16:37

0

在我看来你错过了paintComponent中label.paint()的调用。或者,我认为你可以在你的构造函数中调用add(label),将该标签添加为此容器的子项,并让paintChildren处理它。

因为所有你想要的都是带有自定义背景的标签,所以最好是扩展JLabel,重写paintComponent来绘制自定义背景,然后调用super.paintComponent来绘制前景。

+0

我尝试在我的paintComponent中添加label.paint(g),但这并没有解决问题。在我的构造函数中调用add(label)也没有。 – keyert 2012-04-26 20:52:16