SWT композит - проблема перерисовки - PullRequest
11 голосов
/ 22 июня 2009

У меня есть составной элемент, который изначально имеет метку. Теперь я вызываю dispose на it (метку) и создаю другую метку в том же контейнере (составной вяз), но я не вижу новый текст. Это заставляет меня задуматься о том, как включить перерисовку в композите, чтобы новый ярлык (или любой другой компонент, который я мог создать) отображался вместо старого. Вот код, который у меня есть (разделен на модульный тест для перерисовки композита)

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();
        }
    });

Как вы можете видеть, я вызываю перерисовку для композита после добавления нового элемента. Кроме того, я проверил, что после вызова dispose testCell.getChildren (). Length возвращает 0, как и ожидалось, и когда я создаю новую метку, я получаю то же выражение для возврата 1, проверяя, что новый элемент действительно получает добавлен в родительский составной контейнер Я что-то здесь упускаю?

Ответы [ 2 ]

23 голосов
/ 22 июня 2009

В функции changeText(),

testCell.redraw();

строка должна быть заменена на

testCell.layout();

Или, если вы хотите изменить его размер правильно, вы должны использовать

shell.layout();.

0 голосов
/ 03 апреля 2012

Я бы сказал, добавьте selectionListener на этикетке.

.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(final SelectionEvent e) {
        //Change text by Label.setText();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...