Проблема в том, что во втором примере вы пытаетесь распечатать границы компонента до того, как компонент был добавлен в его контейнер (путем вызова add()
) и до того, как содержимое фрейма было размечено ( звонить pack()
).
Вот моя попытка воспроизвести пример 1. ...
Вот моя попытка воспроизвести пример 2. Я добавил вызов SwingUtilities
, чтобы поместить вещи в правильный поток, и я заполнил содержимое конструктора GetCoordiates
с помощью ваших комментариев:
class GetCoordinate extends JLabel {
public GetCoordinate() {
setText("Foo!");
System.out.println("Coordinate: " + this.getBounds());
}
}
public class Grid extends JFrame {
public Grid() {
setLayout(new GridBagLayout());
GridBagLayout m = new GridBagLayout();
Container c = getContentPane();
c.setLayout(m);
GridBagConstraints con = new GridBagConstraints();
// construct the JPanel
final JPanel pDraw = new JPanel();
m.setConstraints(pDraw, con);
pDraw.add(new GetCoordinate()); // call new class to generate the
// coordinate
c.add(pDraw);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Grid();
}
});
}
}
Так же, как вы описали, он печатает нулевой размер:
Координата: java.awt.Rectangle [x = 0, y = 0, ширина = 0, высота = 0]
Однако, если вы распечатаете размер после добавления компонента и упаковки кадра, он должен работать. Вот модифицированная версия моего Примера 2, где я добавил метод GetCoordinate.printBounds()
и вызвал этот метод, все было добавлено и выложено:
class GetCoordinate extends JLabel {
public GetCoordinate() {
setText("Foo!");
// Let's not try to do this here anymore...
// System.out.println("Coordinate: " + this.getBounds());
}
public void printBounds() // <-- Added this method
{
System.out.println("Coordinate: " + this.getBounds());
}
}
public class Grid extends JFrame {
public Grid() {
setLayout(new GridBagLayout());
GridBagLayout m = new GridBagLayout();
Container c = getContentPane();
c.setLayout(m);
GridBagConstraints con = new GridBagConstraints();
// construct the JPanel
final JPanel pDraw = new JPanel();
m.setConstraints(pDraw, con);
final GetCoordinate content = new GetCoordinate();
pDraw.add(content);
c.add(pDraw);
pack();
setVisible(true);
content.printBounds(); // <-- Added this
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Grid();
}
});
}
}
С этими изменениями я получаю следующий вывод консоли, включая ненулевой размер для моего контента:
Координата: java.awt.Rectangle [x = 5, y = 5, ширина = 23, высота = 16]