Как getLocation () в JPanel JLabel, который был добавлен динамически? - PullRequest
2 голосов
/ 20 августа 2011

Я создал несколько JLabels динамически и добавил их в JPanel со следующим кодом (кода должно быть достаточно, чтобы понять проблему, я надеюсь!).

    JPanel textPanel = new JPanel();
    map = new HashMap<Integer,JLabel>();
    vec = new Vector<JLabel>();
    for(int i = 0; i<getCount();i++){ // getCount() returns int
               JLabel label = new JLabel(getItemText(i)); // getItemText() returns String
               map.put(i, label);
               vec.add(label);
               textPanel.add(map.get(i));
    }

Теперь я пытаюсь получить доступ к расположению этих меток, но не получаю ничего, кроме java.awt.Point[x=296,y=63], при попытке доступа к ним через следующий код.

System.out.println("Component position [1]: " +
textPanel.getComponent(1).getLocationOnScreen());

Я получаю одинаковую позицию для всех компонентов, а не только для одного.

Также (что более важно) я получаю позицию java.awt.Point[x=0,y=0] для следующего кода.

System.out.println("Position of Component 1: " + map.get(1).getLocation());

Полагаю, это связано с тем, что JLabels создаются динамически. Однако мне действительно необходимо создавать их динамически, а также действительно необходимо иметь возможность получать их местоположение с помощью getLocation().

Пожалуйста, помогите! Возможно, существует другой способ их создания или другой способ доступа к их местоположениям?

Ответы [ 2 ]

5 голосов
/ 21 августа 2011

При создании компонента его расположение по умолчанию (0, 0);

Добавление компонента на панель НЕ меняет это местоположение.

После добавления всех ярлыков на панель вам нужно сделать:

panel.revalidate();

Это вызовет менеджер раскладки, используемый панелью, и затем каждой метке будет назначено правильное местоположение в соответствии с правилами диспетчера раскладки.

4 голосов
/ 21 августа 2011

Вот SSCCE.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class WhereIsMyComponent {

    public static void showComponentLocations(Container parent) {
        Component[] all = parent.getComponents();
        System.out.println("Show locations of children..");
        for (Component c : all) {
            System.out.println(c.getLocation());
        }
    }

    public static void main(String[] args) {
        String msg = "Hello World!";
        final JPanel p = new JPanel(new FlowLayout());
        for (int ii=0; ii<6; ii++) {
            p.add(new JLabel(msg));
        }

        ComponentListener cl = new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent ce) {
                showComponentLocations(p);
            }
        };

        p.addComponentListener(cl);

        JFrame f = new JFrame("Where Is My Component?");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(p);
        f.pack();
        f.setSize(400,300);
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
}

Типичный выход

Show locations of children..
java.awt.Point[x=16,y=5]
java.awt.Point[x=89,y=5]
java.awt.Point[x=162,y=5]
java.awt.Point[x=235,y=5]
java.awt.Point[x=308,y=5]
java.awt.Point[x=162,y=26]
Show locations of children..
java.awt.Point[x=16,y=5]
java.awt.Point[x=89,y=5]
java.awt.Point[x=162,y=5]
java.awt.Point[x=235,y=5]
java.awt.Point[x=308,y=5]
java.awt.Point[x=162,y=26]
Show locations of children..
java.awt.Point[x=26,y=5]
java.awt.Point[x=99,y=5]
java.awt.Point[x=172,y=5]
java.awt.Point[x=26,y=26]
java.awt.Point[x=99,y=26]
java.awt.Point[x=172,y=26]
Press any key to continue . . .
...