SWT-композит — проблема с перерисовкой
-
06-07-2019 - |
Вопрос
У меня есть составной элемент, который изначально имеет метку.Теперь я вызываю Dispose для него (метки) и создаю еще одну метку в том же контейнере (составной вяз), но не вижу нового текста.Это заставляет меня задаться вопросом, как включить перерисовку композиции, чтобы новая метка (или любой другой компонент, который я могу создать) отображалась вместо старой.Вот код, который у меня есть (разделен на модульный тест для перерисовки композита)
private Label createLabel( Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setAlignment(SWT.CENTER);
label.setLayoutData( new GridData( SWT.CENTER, SWT.CENTER, true, true) );
return label;
}
private void changeText() {
assert testCell != null : "Please initialize test cell";
testCell.getChildren()[0].dispose();
Label l = createLabel(testCell);
l.setText("New TexT");
testCell.redraw();
}
private void draw() {
Display display = new Display();
shell = new Shell(display);
shell.setLayout(new GridLayout(2,false));
testCell = new Composite(shell,SWT.BORDER);
testCell.setLayout(new GridLayout());
Label l = createLabel(testCell);
l.setText("Old Text");
Composite btnCell = new Composite(shell,SWT.NONE);
btnCell.setLayout(new GridLayout());
Button b = new Button(btnCell, SWT.PUSH);
b.setText("Change");
b.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event e) {
changeText();
}
});
Как видите, я вызываю перерисовку композиции после добавления нового элемента.Кроме того, я подтвердил, что после вызова для утилизации, testcell.getchildren (). Длина возвращает 0, как и ожидалось, и когда я создаю новую метку, я получаю то же выражение, чтобы вернуть 1, подтверждая, что новый элемент действительно получает Добавлено в его родительский композитный контейнер, я что -то здесь не хватает?
Решение
в changeText()
функция,
testCell.redraw();
строку следует заменить на
testCell.layout();
Или, если вы хотите правильно изменить его размер, вы должны использовать
shell.layout();
.
Другие советы
Я бы сказал, добавьте selectionListener на этикетке.
.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
//Change text by Label.setText();
}
}