2014-11-20 3 views
0

Я работаю над Java-приложением.Как добавить JLabel в JPanel

Я добавляю несколько меток после настройки рамки и ее видимости. Я также назвал revalidate() на JPanel, на котором я добавляю метки.

Но не все ярлыки возвращают правильное положение.

Вот мой код.

public class Test { 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame(); 

     JScrollPane scrollPane = new JScrollPane();  
     JPanel view = new JPanel(); 
     view.setLayout(new MigLayout()); 
     scrollPane.setViewportView(view); 
     frame.setContentPane(scrollPane); 

     frame.setSize(800, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     List<JComponent> labels = update(view); 

     printLocations(labels); 
    } 

    public static List<JComponent> update(JPanel view) { 
     view.removeAll(); 

     List<JComponent> labels = new ArrayList<>(); 

     for (int i = 0; i < 10; i++) { 
      JLabel label = new JLabel("Label " + i); 
      view.add(label); 
      labels.add(label); 
     } 

     view.revalidate(); 
     view.repaint(); 

     return labels; 
    } 

    private static void printLocations(List<JComponent> labels) { 
     for (JComponent label : labels) { 
      System.out.println(label.getLocation()); 
     } 
    } 

} 

Вот результат:

java.awt.Point[x=7,y=7] 
java.awt.Point[x=52,y=7] 
java.awt.Point[x=97,y=7] 
java.awt.Point[x=0,y=0] 
java.awt.Point[x=0,y=0] 
java.awt.Point[x=0,y=0] 
java.awt.Point[x=0,y=0] 
java.awt.Point[x=0,y=0] 
java.awt.Point[x=0,y=0] 
java.awt.Point[x=0,y=0] 

В этом коде, если добавить некоторую задержку между адресом уточнения и печатания компонентов; все компоненты возвращают правильное положение. Но, в моем приложении, даже задержка не работает!

ответ

0

Оказывается, нам нужно будет позвонить revalidate() на корневой компонент. Тогда эта проблема решена.

В этом примере корневой компонент равен frame. Таким образом, код будет выглядеть следующим образом:

public class Test { 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame(); 

     JScrollPane scrollPane = new JScrollPane();  
     JPanel view = new JPanel(); 
     view.setLayout(new MigLayout()); 
     scrollPane.setViewportView(view); 
     frame.setContentPane(scrollPane); 

     frame.setSize(800, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     List<JComponent> labels = update(view); 

     frame.revalidate(); 

     printLocations(labels); 
    } 

    public static List<JComponent> update(JPanel view) { 
     view.removeAll(); 

     List<JComponent> labels = new ArrayList<>(); 

     for (int i = 0; i < 10; i++) { 
      JLabel label = new JLabel("Label " + i); 
      view.add(label); 
      labels.add(label); 
     } 

     view.repaint(); 

     return labels; 
    } 

    private static void printLocations(List<JComponent> labels) { 
     for (JComponent label : labels) { 
      System.out.println(label.getLocation()); 
     } 
    } 

} 
+0

'frame.revalidate();' '== JFrame.pack()' 'Перед SetVisible (истина)', то JFrame может возвращения все границы или Dimension – mKorbel

+0

Список labels = update (view); after frame.setVisible (true); , вы рискуете, что JComponent добавлены в уже видимый JFrame, стандартный модуль LayoutManager, отсутствующий в автоматическом уведомлении, код неправильный, или идея неверна, конечно зависит от реальной идеи, цель – mKorbel

+0

@mKorbel Итак, все компоненты должны быть добавлены до frame.setVisible (правда)? – Akshat

Смежные вопросы