В моем приложении Codename One, в то время как приложение отправляет запрос, я хочу показать InfiniteProgress
в центре, а ниже - центрированную метку, которая сообщает пользователю что происходит. Поэтому я создал контейнер с BorderLayout
и добавил бесконечный прогресс с ограничением BorderLayout.CENTER
и контейнером с ограничением BorderLayout.SOUTH
, который содержит метку. Внутренняя компоновка контейнера - BorderLayout
с BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE
. Затем я просто добавляю метку с ограничением BorderLayout.CENTER
, и это центрирует метку. Однако, когда я пытаюсь изменить текст ярлыка на что-то более длинное, он становится срезанным. Проблема может быть продемонстрирована с использованием приведенной ниже простой пример:Центрируйте ярлык в южном контейнере макета границы в Codename One
Form hi = new Form("Welcome", new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE));
Button button = new Button("Change text");
Label label = new Label("South");
button.addActionListener(event -> {
label.setText("A lot longer text");
});
hi.add(BorderLayout.CENTER, button);
Container container = new Container();
container.setLayout(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE));
container.add(BorderLayout.CENTER, label);
hi.add(BorderLayout.SOUTH, container);
hi.show();
Теперь, когда я нажимаю на кнопку, чтобы изменить текст метки, вы можете увидеть, что метка не показывает весь текст (см фотографии) ,
Спасибо! Я думал, что Label установит это автоматически, как это происходит во многих случаях, но я обязательно должен был попробовать это. –
repaint() вызывается, revalidate() работает намного медленнее, так как ему нужно перепланировать интерфейс, чтобы он не был неявным. Это также позволяет такие вещи, как 'animateLayout()', которые не будут работать, если revalidate неявно –
Итак, разница между repaint() и revalidate() заключается в том, что revalidates() снова помещает все компоненты в контейнер, так что, например, я бы call revalidate() при добавлении компонента в контейнер, а repaint() просто перекраивает компонент, и я бы назвал его, когда я изменяю внешний вид компонента, как в этом примере. Правильно ли я понял разницу между ними? –