2015-04-27 7 views
2

Когда я изменяю свойство менеджера компоновки компонента, который в настоящее время отображается в SWING, изменения не становятся видимыми. Если я изменяю размер всего кадра, изменения становятся видимыми.Изменения выравнивания FlowLayout не видны непосредственно в Swing

Как решить эту проблему? Я экспериментировал с revalidate() и друзьями, но безуспешно. Также LayoutFun.this.revalidate(); после строки, в которой изменяется свойство макета (mgr.setAlignment(align);), никому не помогает.

Короткий пример самораскрытия - при нажатии кнопки его выравнивание должно измениться. Вместо этого ничего не происходит (на моем компьютере), и только если я изменяю размер всего кадра, изменения становятся видимыми.

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

public class LayoutFun extends JFrame { 

    public LayoutFun() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final FlowLayout mgr = new FlowLayout(FlowLayout.CENTER); 
     setLayout(mgr); 
     add(new JButton(new AbstractAction("Other alignment") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       int align = mgr.getAlignment(); 
       switch (align) { 
        case FlowLayout.CENTER: 
         align = FlowLayout.LEFT; 
         break; 
        case FlowLayout.LEFT: 
         align = FlowLayout.RIGHT; 
         break; 
        default: 
        case FlowLayout.RIGHT: 
         align = FlowLayout.CENTER; 
         break; 
       } 
       mgr.setAlignment(align); 
      } 
     })); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       LayoutFun lst = new LayoutFun(); 
       lst.setVisible(true); 
       lst.setSize(600, 400); 
      } 
     }); 
    } 
} 

ответ

3

Validate & перекрашивать видимую часть кадра, т.е. ContentPane

getContentPane().revalidate(); 
getContentPane().repaint(); 
+0

Это работает. Удивительно. Но что, когда я не прямо в JFrame. Допустим, я получаю контейнер Container и call '((FlowLayout)) .setAlignment (align);' на контейнере? 'getContentPane()' не выходит, чем. – mythbu

+0

, то вы используете ссылку на контейнер ... – Reimeus

+0

Не так просто в моем приложении. Но ваш ответ помог в любом случае. – mythbu