2013-05-01 4 views
1

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

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

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

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

  3. В классе точки входа onModuleLoad я просто эта сетка код:

    окончательный DataGrid grid_far = новый DataGrid(); grid_far.setGridData();

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

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

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

Не уверен, что вы спрашиваете: я подозреваю, что это касается определения области во внутреннем цикле (где вы можете использовать только конечные переменные). Возможно, вам нужно уточнить свой вопрос? – John3136

+0

Спасибо. Из вашего ответа теперь ясно, что я не могу использовать внешние переменные во внутреннем цикле. Если бы какой-либо способ сделать объект ListGrid «static», я бы не подумал о том, чтобы перегрузить объект ListGrid. Итак, мой главный интерес - «static» ListGrid. – kurru

+0

Теперь я удалил «реализует EntryPoint» из основного класса и поэтому сумел опубликовать public-static void onModuleLoad(). Это позволяет мне использовать MainClass.onModuleLoad() из другого класса, и когда я запустил этот метод, сетка будет сгенерирована (по крайней мере, я надеюсь, что не дублируется). – kurru

ответ

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

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

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

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

Проверьте следующие ссылки для получения более подробной информации об использовании локальных переменных во внутренних классах
Inner class and local variables
Question about local final variable in Java

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

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

  • «может быть, я не должен использовать так много классов, просто поставить все в классе onModuleLoad точки входа()»

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

  • «EntryPoint»

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

Пройдите через SmartGWT showcase, включая образцы кода.
Для получения более подробной информации см. 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; 
    } 
}