我希望能够生成各种各样的地图,这些地图将小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);
}
}
问题在于它似乎没有做任何事情。地图上不会出现黑点。也许现在它就像向面板添加标签的错误实现一样简单?
答案 0 :(得分:1)
以下是一些可能以某种方式帮助您的代码,您的问题在细节上有点模糊,但我认为这正是您所寻找的。 p>
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的标签。