Проблема с setvisible (true)
-
18-09-2019 - |
Вопрос
Два примера, показанные ниже, одинаковы. Оба предполагаются получить один и тот же результат, например, генерировать координаты изображений, отображаемых на JPanel. Пример 1 работает отлично (распечатайте координаты изображений), однако пример 2 возврата 0 для координаты.
Мне было интересно, почему, потому что я поместил SetVisible (True) после добавления панели в обоих примерах. Единственное отличие - это пример 1 используется extends JPanel
и пример 2 extends JFrame
Пример 1:
public class Grid extends JPanel{
public static void main(String[] args){
JFrame jf=new JFrame();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Grid grid = new Grid();
jf.add(grid);
jf.pack();
Component[] components = grid.getComponents();
for (Component component : components) {
System.out.println("Coordinate: "+ component.getBounds());
}
jf.setVisible(true);
}
}
Пример 2:
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
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) {
new Grid();
}
}
Решение
Проблема в том, что во втором примере вы пытаетесь распечатать границы компонента до того, как компонент будет добавлен в его контейнер (вызывая 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, width = 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
Другие советы
Распространенной причиной таких аномалий не может начать с По восточному времени. Анкет В этом случае я не могу сказать из вашего кода, что отличается: в частности, неясно, где печатает второй пример.
конфликт
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author LENOVO G40
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new FrmMenuUTama().setVisible(true);
}
}