Создание JLabels по требованию - PullRequest
0 голосов
/ 17 июля 2011

Я хотел бы иметь возможность создавать карту своего рода, которая размещает маленькие JLabels в координатных точках на панели. Проблема в том, что мне нужно, чтобы они генерировались случайным образом, поэтому я не знаю заранее, сколько у меня будет. Есть ли способ сделать это?

Надеюсь, это не нарушит табу Java-кодирования - я самоучка.

* Edit: Я знаю, что я был расплывчатым - моя программа огромна и громоздка, и я разработал свои собственные соглашения (которые, я уверен, поднимет хаки реальных кодеров Java :-P), я должен был указать, что у меня есть класс Location, и может легко генерировать случайные места. Проблема в том, что я создаю новую 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 ]

1 голос
/ 17 июля 2011

но знаете ли вы, возможно ли добавить слушатель мыши к каждому из этих jlabels при их создании?

Конечно, это возможно.Вам даже не нужно каждый раз создавать нового слушателя.Вы можете создать один слушатель, который будет использоваться всеми метками.Затем внутри кода слушателя вы используете:

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

и у вас есть доступ к метке, сгенерировавшей MouseEvent.

1 голос
/ 17 июля 2011

Вот код, который может помочь вам, ваш вопрос был немного расплывчат в деталях, но я думаю, что это то, что вы ищете.

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 должен быть добавлен только в JLabels из-за приведенного типа. Надеюсь, это помогло!

...