Проблема с setVisible (правда) - PullRequest
2 голосов
/ 09 марта 2010

Два приведенных ниже примера одинаковы. Оба должны давать один и тот же результат, например генерировать координаты изображений, отображаемых на 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();
    }
   }

Ответы [ 3 ]

2 голосов
/ 09 марта 2010

Проблема в том, что во втором примере вы пытаетесь распечатать границы компонента до того, как компонент был добавлен в его контейнер (путем вызова 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]

0 голосов
/ 14 июля 2017

contoh

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);
    }
}
0 голосов
/ 09 марта 2010

Распространенной причиной таких аномалий не является запуск на EDT . В этом случае я не могу сказать из вашего кода, что отличается: в частности, неясно, где печатается второй пример.

...