Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Разъясните код с SWT


Автор: zhz 24.2.2012, 02:46
Может, кто то посчитает, что тему следовало создать в "Общем" разделе, но все таки тут про ГУИ)). Вообщем такой код:
Код

        Display display = new Display();
        Shell shell = new Shell(display);
        GridLayout layout = new GridLayout(2, false);
        // set the layout of the shell
        shell.setLayout(layout);
        // Create a label and a button
        Label label = new Label(shell, SWT.NONE);
        label.setText("A lable");
        Button button = new Button(shell, SWT.PUSH);
        button.setText("Press Me");
        
        // Create a new label that will spam two columns
        label = new Label(shell, SWT.BORDER);
        label.setText("This is a label");
        // Create new layout data
        GridData data = new GridData(GridData.FILL, GridData.BEGINNING, true,
                false, 2, 1);
        label.setLayoutData(data);
        
        // Create a new label which is used as a separator
        label = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
        // Create new layout data
        data = new GridData(GridData.FILL, GridData.BEGINNING, true,
                false, 2, 1);
        data.horizontalSpan=2;
        label.setLayoutData(data);


Мне непонятно, зачем автор объявив один раз переменную (Label label), в дальнейшем для создания собственно, нескольких контроллов Label использует ОДНУ, ранее объявленную переменную? т.Е
Код

Label label = new Label(shell, SWT.NONE);
label.setText("Это первый лейбел");
//Нужен еще один label, создаем его из уже имеющейся переменной
label = new Label(shell, SWT.BORDER);
label.setText("Это еще один лейбел!");


В чем здесь логика? Зачем так делают? Правильно ли это? Получается ведь, что к первому лейбелу уже никак не обратится?!

Ps Взглянул еще раз на код, и обратил внимание, что автор проделывает данный трюк только с лейбелами, для кнопок, например, каждый раз объявляет  новую переменную, видимо label в дальнейшем не используется, поэтому и одна переменная на весь интерфейс. Тем не менее, как вообще программа работает? Ведь вызывая конструктор для уже созданного контрола, он сначала уничтожается? или нет? почему тогда в окне существуют несколько лейбелов, при том что это одна переменная?!

Автор: Skynin 24.2.2012, 10:01
Значит автору и не нужно далее обращаться к этим объектам.
А ссылки на них сохраняется в shell.
Причем если очень нужно - то можно оттуда их опять достать.

Цитата

Ведь вызывая конструктор для уже созданного контрола, он сначала уничтожается?

Никак нет.
Объект в Java удаляется сборщиком мусора, когда на него нет ссылок (или ссылки хранятся в других объектах подлежащих удалению)

Цитата
при том что это одна переменная?!

Переменная хранит ссылку. То есть указатель на область памяти в которой лежат данные объекта.
Эту ссылку можно многократно копировать в другие переменные или поля других объектов, коллекции и т.д.
Переменная никак не отвечает - ни за область памяти, ни за само значение ссылки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)