按需生成JLabel

时间:2011-07-17 05:54:22

标签: java swing jlabel

我希望能够生成各种各样的地图,这些地图将小JLabel放置在面板上的坐标位置。问题是我需要随机生成它们,所以我事先并不知道我会有多少。有没有办法做到这一点?

我希望这不会破坏任何Java编码禁忌 - 我是自学成才。

*编辑: 我知道我很模糊 - 我的程序庞大而且繁琐,而且我已经开发了自己的约定(我肯定会引起真正的java程序员的hackles :-P)我应该指定我有一个类位置,而我可以轻松生成随机位置。我遇到的麻烦是为每个位置创建一个新的jLabel。这就是我所拥有的:

//Method called after a new Location has been created, to add it to the map
public void addLocation(Location newLocation)
{
    int xx = newLocation.getXloc(); 
    int yy = newLocation.getYloc();

    for (int i=0;i<1;i++)
    {
        JLabel tempLabel = new JLabel(); //tempLabel instantiated elsewhere (is that a problem?)
        tempLabel.setBackground(Color.BLACK);
        tempLabel.setBounds(xx,yy,3,3);
        Map.add(tempLabel); //Map is a JPanel with null layout manager 
        tempLabel.setVisible(true);
    }
}

问题在于它似乎没有做任何事情。地图上不会出现黑点。也许现在它就像向面板添加标签的错误实现一样简单?

2 个答案:

答案 0 :(得分:1)

以下是一些可能以某种方式帮助您的代码,您的问题在细节上有点模糊,但我认为这正是您所寻找的。

public void generate(JPanel panel)
{
    int panelWidth = 500;
    int panelHeight = 500;
    JLabel label;

    Random random = new Random(Calendar.getInstance().getTimeInMillies());
    int numberOfLabels = random.nextInt(100);
    for(int x=0;x<numberOfLabels;x++)
    {
        int locX = random.nextInt(panelWidth);
        int locY = random.nextInt(panelHeight);

        label = new JLabel("Hello World!!");
        label.setLocation(locX,locY);
        label.setVisible(true);
        panel.add(label);
    }
}

如果这不是您正在寻找的答案,或者您需要更多帮助,请告诉我很高兴能帮忙。希望这有帮助!!

更新:这是使用MouseListener执行此操作的方式:

public void generate(JPanel panel)
{
    int panelWidth = 500;
    int panelHeight = 500;
    JLabel label;

    Random random = new Random(Calendar.getInstance().getTimeInMillies());
    int numberOfLabels = random.nextInt(100);
    for(int x=0;x<numberOfLabels;x++)
    {
        int locX = random.nextInt(panelWidth);
        int locY = random.nextInt(panelHeight);

        label = new JLabel("Hello World!!");
        label.setName("World Label");
        // If some of your labels have the same Text then you should set a different
        //     name to each one so that you can tell the difference between them
        //     when you handle the mouse events.
        label.addMouseListener(new PlayerListener());
        // PlayerListener would be the class that implements MouseListener
        label.setLocation(locX,locY);
        label.setVisible(true);
        panel.add(label);
    }
}

这将是你的MouseListener:

public void mousePressed(MouseEvent e)
{
    JLabel label = (JLabel)e.getSource();
    if(label.getName().equalsIgnoreCase("World Label"))
    {
        System.out.println("Hello World!!");
    }
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}

由于类型转换,只应将此MouseListener添加到JLabel。希望这有帮助!

答案 1 :(得分:1)

  

但您是否碰巧知道是否可以在创建这些jlabel时为每个jlabel添加一个mouselistener?

当然可能。您甚至不需要每次都创建一个新的侦听器。您可以创建一个由所有标签使用的侦听器。然后在你使用的监听器代码中:

JLabel label = (JLabel)event.getSource(); 

您可以访问生成MouseEvent的标签。