SmartGWT ListGrid финал

Я понял, что ListGrid всегда должен быть Final. Для меня статический объект был бы лучшим, потому что я хотел бы изменить его свойства из другого класса.

В моем проекте, чтобы иметь четкий код, я создал несколько классов.

  1. учебный класс DataGrid extends ListGrid который устанавливает свойства нового объекта, а также заполняет данные. Метод @Override добавляет кнопку к моему объекту сетки.

  2. учебный класс PopupWindow extend Window который используется для создания объекта Window при нажатии на кнопку редактирования в ListGrid. В окне есть несколько текстовых полей, где вы можете добавить новые данные и кнопку Отправить. Событие OnClick кнопки Submit записывает данные на сервер MySQL и должно обновить сетку фактическими данными (запрос из MySQL). Эту часть я не могу реализовать.

  3. В классе Entry Point onModuleLoad у меня просто есть этот код сетки:

    final DataGrid grid_far = new DataGrid (); grid_far.setGridData ();

Я новичок в Java, может быть, я не должен использовать так много классов, просто поместить все в класс Entry Point onModuleLoad()?

Если в PopupWindow расширяется класс Window, я объявляю Button OnClick для запуска метода onModuleLoad () из класса Entry Point, будет ли это дублировать мою веб-страницу? Я имею в виду делать это:

 EntryPointClass ep = new EntryPointClass();
 ep.onModuleLoad();

1 ответ

Решение
  • "ListGrid должен быть всегда Final"

Это не обязательно. Можно создавать переменные ListGrid как не окончательные.
Вы, наверное, видели примеры, где переменные ListGrid были объявлены как окончательные, но это по какой-то другой причине.

Например, невозможно использовать не окончательную локальную переменную (объявленную внутри метода) в анонимном внутреннем классе.
Таким образом, чтобы получить доступ к локальным переменным из внутреннего класса, они должны быть объявлены как final.
В SmartGWT/Swing/ и т.д. внутренние классы используются для реализации различных функций обратного вызова, таких как обработка событий.

public class Screen {

    ListGrid grid1 = new ListGrid();
    TextItem text1 = new TextItem("text1", "Text 1");

    public void initialize() {
        // normally its not required to create subclasses of ListGrid/Button/Window/etc.
        // unless a significant change in their behavior is needed

        ListGrid grid2 = new ListGrid();
        // setup grid properties
        // set grid fields

        TextItem text2 = new TextItem("text2", "Text 2");

        final ListGrid grid3 = new ListGrid();
        final TextItem text3 = new TextItem("text3", "Text 3");

        IButton button = new IButton("Edit");
        button.addClickHandler(new ClickHandler() { // this is declaring an anonymous inner class
            public void onClick(ClickEvent clickEvent) { // this method is a member of that anonymous inner class
                // out of three ListGrid and thee TextItem instances, only following can be accessed in this method/class
                //   grid1, text1 (these are not local variables, inner class can access outer class members without any issue)
                //   grid3, text3 (as they are final, even though local variables)
            }
        });

        // that does not mean, grid2 and text2 can not be used, they can be, just not inside an anonymous inner class
        // e.g.-
        DynamicForm form = new DynamicForm();
        form.setFields(text2);

        VLayout layout = new VLayout();
        layout.addMember(grid2);
    }
}

Проверьте следующие ссылки для более подробной информации об использовании локальных переменных во внутренних классах
Внутренний класс и локальные переменные
Вопрос о локальной финальной переменной в Java

  • "статический объект был бы лучшим, потому что я хотел бы изменить его свойства из другого класса"

Есть лучшие способы общения между объектами, чем использование статических переменных.

  • "возможно, мне не следует использовать так много классов, просто поместите все в класс Entry Point в onModuleLoad()"

Лучше сохранить код в onModuleLoad () до минимума.
Количество необходимых классов зависит от того, что вы пытаетесь реализовать.

  • "Точка входа"

Вы не можете удалить реализацию EntryPoint, так как именно здесь GWT будет передавать выполнение для создания приложения.
И для этого вызывается onModuleLoad () движком GWT/JavaScript.
Он не должен вызываться вашим кодом.

Пройдите демонстрацию SmartGWT, включая примеры кода.
См. SmartGWT API для более подробной информации.
Существует несколько способов создания пользовательского интерфейса для достижения одинаковых результатов.

Связь с сервером для отправки / получения данных в SmartGWT - это отдельная тема.

Возможные рекомендации по внедрению.

public class EntryPointClass implements EntryPoint {
    public void onModuleLoad() {
        ApplicationScreen screen = new ApplicationScreen();

        HStack drawArea = new HStack();
        drawArea.setWidth100();
        drawArea.setHeight100();
        drawArea.addMember(screen.getComponents());
        drawArea.draw();
    }
}

public class ApplicationScreen { // this class does not need to extend from a widget
    public Canvas getComponents() {
        // a method that prepares the interface
        // using a from+grid type layout, without a popup window

        ListGrid grid = getListGrid();

        DynamicForm form = getDynamicForm(grid); // have to pass grid in order to add/update records on button events

        VLayout layout = new VLayout();
        layout.addMember(form);
        layout.addMember(grid);

        return layout;
    }

    private DynamicForm getDynamicForm(final ListGrid grid) { // have to declare grid as final to access from event handler inner classes
        final TextItem text1 = new TextItem("text1", "Text 1");  // have to declare as final for same reason

        ButtonItem saveButton = new ButtonItem("Save");
        saveButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent clickEvent) {
                // use text1, grid and other components to save form values and refresh grid
            }
        });

        // creating and configuring form
        DynamicForm form = new DynamicForm();
        form.setWidth100();
        form.setFields(text1, saveButton);

        return form;
    }

    private ListGrid getListGrid() {
        // preparing grid fields
        ListGridField field1 = new ListGridField("field1", "Field 1");

        // creating and configuring grid
        ListGrid grid = new ListGrid(); // not final, does not need to be
        grid.setWidth100();
        grid.setFields(field1);

        return grid;
    }
}
Другие вопросы по тегам