- "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 как то, где 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;
}
}
Не уверен, что вы спрашиваете: я подозреваю, что это касается определения области во внутреннем цикле (где вы можете использовать только конечные переменные). Возможно, вам нужно уточнить свой вопрос? – John3136
Спасибо. Из вашего ответа теперь ясно, что я не могу использовать внешние переменные во внутреннем цикле. Если бы какой-либо способ сделать объект ListGrid «static», я бы не подумал о том, чтобы перегрузить объект ListGrid. Итак, мой главный интерес - «static» ListGrid. – kurru
Теперь я удалил «реализует EntryPoint» из основного класса и поэтому сумел опубликовать public-static void onModuleLoad(). Это позволяет мне использовать MainClass.onModuleLoad() из другого класса, и когда я запустил этот метод, сетка будет сгенерирована (по крайней мере, я надеюсь, что не дублируется). – kurru