SWT/JFace: удалите виджеты

Во время компоновки вы можете попросить компоновщика сообщить вам, в каком входном файле (объектный файл, член статической библиотеки или совместно используемая библиотека) он находит определение любого символа и в каких файлах он находит этот символ, на который ссылаются, используя опцию компоновщика. -trace-symbol=name .

Например:

$ cat main.c
extern void foo(void);

int main(void)
{
    foo();
    return 0;
}

$ cat foo.c
#include 

void foo(void)
{
    fputs(__func__,stdout);
}

Скомпилировать источники:

$ gcc -Wall -c main.c foo.c

Создать статическую библиотеку:

$ ar rcs libfoo.a foo.o

Связать программу, запрашивающую трассировки символов для foo и fputs:

$ gcc -o prog main.o -L. -lfoo -Wl,-trace-symbol=foo,-trace-symbol=fputs
/usr/bin/ld: main.o: reference to foo
/usr/bin/ld: ./libfoo.a(foo.o): definition of foo
/usr/bin/ld: ./libfoo.a(foo.o): reference to fputs
/usr/bin/ld: //lib/x86_64-linux-gnu/libc.so.6: definition of fputs

Таким образом, foo определено в элементе архива foo.o из ./libfoo.a, а fputs определено в /lib/x86_64-linux-gnu/libc.so.6

13
задан Thilo 1 April 2009 в 07:55
поделиться

3 ответа

Используйте Widget.dispose.

public class DisposeDemo {
  private static void addControls(final Shell shell) {
    shell.setLayout(new GridLayout());
    Button button = new Button(shell, SWT.PUSH);
    button.setText("Click to remove all controls from shell");
    button.addSelectionListener(new SelectionListener() {
      @Override public void widgetDefaultSelected(SelectionEvent event) {}
      @Override public void widgetSelected(SelectionEvent event) {
        for (Control kid : shell.getChildren()) {
          kid.dispose();
        }
      }
    });
    for (int i = 0; i < 5; i++) {
      Label label = new Label(shell, SWT.NONE);
      label.setText("Hello, World!");
    }
    shell.pack();
  }

  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    addControls(shell);
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    display.dispose();
  }
}
8
ответ дан 2 December 2019 в 01:11
поделиться

Другой вариант - использовать StackLayout для переключения между базовыми элементами управления. Это предотвращает появление ошибки «Виджет удален».

2
ответ дан 2 December 2019 в 01:11
поделиться

Необходимо или звонить comment.changeParent(newParent) или comment.setVisible(false) удалить/скрыть его из Группы. Я не уверен если comment.changeParent(null) работал бы, но я дам этому попытку.

Мы делаем это этот путь, потому что SWT использует Составной Шаблон.

1
ответ дан 2 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: