2016-10-25 2 views
1

В моем приложении 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(); 

Теперь, когда я нажимаю на кнопку, чтобы изменить текст метки, вы можете увидеть, что метка не показывает весь текст (см фотографии) ,

enter image description hereenter image description here

ответ

1

Добавьте эту строку после того, как вы установили текст метки:

label.getParent().revalidate(); 
+0

Спасибо! Я думал, что Label установит это автоматически, как это происходит во многих случаях, но я обязательно должен был попробовать это. –

+1

repaint() вызывается, revalidate() работает намного медленнее, так как ему нужно перепланировать интерфейс, чтобы он не был неявным. Это также позволяет такие вещи, как 'animateLayout()', которые не будут работать, если revalidate неявно –

+0

Итак, разница между repaint() и revalidate() заключается в том, что revalidates() снова помещает все компоненты в контейнер, так что, например, я бы call revalidate() при добавлении компонента в контейнер, а repaint() просто перекраивает компонент, и я бы назвал его, когда я изменяю внешний вид компонента, как в этом примере. Правильно ли я понял разницу между ними? –