Когда я изменяю свойство менеджера компоновки компонента, который в настоящее время отображается в 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);
}
});
}
}
Это работает. Удивительно. Но что, когда я не прямо в JFrame. Допустим, я получаю контейнер Container и call '((FlowLayout)) .setAlignment (align);' на контейнере? 'getContentPane()' не выходит, чем. – mythbu
, то вы используете ссылку на контейнер ... – Reimeus
Не так просто в моем приложении. Но ваш ответ помог в любом случае. – mythbu