powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / GWT: A widget that has an existing parent widget may not be added to the detach list
5 сообщений из 5, страница 1 из 1
GWT: A widget that has an existing parent widget may not be added to the detach list
    #39140208
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка возникает при вставке дерева в ячейку таблицы в html с определенным id:
Код: java
1.
2.
3.
Tree buildingsTree = new Tree();
 ...
RootPanel.get("container1").add(buildingsTree);



Вот так выглядит эта таблица в html исходнике
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    <table align="center" id="content" class="hidden_content">
      <tr>
        <td id="container1" width="250" height="300" border="1" valign="top"></td>
        <td id="container2" width="250" height="300" border="1" valign="top">
        <table id="editForm">
        <tr>
       	  <td id="field1_label"></td><td id="field1"></td>
        </tr>
        <tr>
       	  <td id="field2_label"></td><td id="field2"></td>
        </tr>
        <tr>
       	  <td id="field3_label"></td><td id="field3"></td>
        </tr>
        </tr>
        <tr>
       	  <td colspan="2" align="left" id="save_button"></td>
        </tr>
        </table>
        </td>    <tr>
       	  <td colspan="2" id="field4"></td>
    
      </tr>
    </table> 





Полный код класса точки входа
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
public class Testgwt implements EntryPoint {
	/**
	 * The message displayed to the user when the server cannot be reached or
	 * returns an error.
	 */
	private static final String SERVER_ERROR = "An error occurred while "
			+ "attempting to contact the server. Please check your network "
			+ "connection and try again.";
	
	private static final String LOGIN_ERROR = "Username or login is not valid";
	
	private static final Integer MAX_ATTEMTS_NUMBER = new Integer(3);
	
	private static final long HOURS_NUMBER = 24;
	
	private Integer loginAttempts = new Integer(0);
	
	

	/**
	 * Create a remote service proxy to talk to the server-side Greeting service.
	 */
	private final GreetingServiceAsync greetingService = GWT
			.create(GreetingService.class);

	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {
		final Button sendButton = new Button("Send");
		final TextBox nameField = new TextBox();
		final TextBox passwordField = new TextBox();
		final Label errorLabel = new Label();

		// We can add style names to widgets
		sendButton.addStyleName("sendButton");
		String cookieValue = Cookies.getCookie("invalid_login");
		if (cookieValue != null) {
			loginAttempts = new Integer(cookieValue);
			if (loginAttempts.equals(MAX_ATTEMTS_NUMBER)) {
				sendButton.setText("The account is locked");
				sendButton.setEnabled(false);
			}
		}
		// Add the nameField and sendButton to the RootPanel
		// Use RootPanel.get() to get the entire body element
		RootPanel.get("nameFieldContainer").add(nameField);
		RootPanel.get("passwordFieldContainer").add(passwordField);
		RootPanel.get("sendButtonContainer").add(sendButton);
		RootPanel.get("errorLabelContainer").add(errorLabel);

		// Focus the cursor on the name field when the app loads
		nameField.setFocus(true);
		nameField.selectAll();

		// Create the popup dialog box
		final DialogBox dialogBox = new DialogBox();
		dialogBox.setText("Remote Procedure Call");
		dialogBox.setAnimationEnabled(true);
		final Button closeButton = new Button("Close");
		// We can set the id of a widget by accessing its Element
		closeButton.getElement().setId("closeButton");
		final HTML serverResponseLabel = new HTML();
		VerticalPanel dialogVPanel = new VerticalPanel();
		dialogVPanel.addStyleName("dialogVPanel");
		dialogVPanel.add(serverResponseLabel);
		dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
		dialogVPanel.add(closeButton);
		dialogBox.setWidget(dialogVPanel);

		// Add a handler to close the DialogBox
		closeButton.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				dialogBox.hide();
				if (loginAttempts < MAX_ATTEMTS_NUMBER) {
					sendButton.setEnabled(true);
					sendButton.setFocus(true);
				} else {
					sendButton.setText("The account is locked");
				}
			}
		});
		
		final List<Building> buildings = new ArrayList<Building>();
	    greetingService.listBuildings(new AsyncCallback<List<Building>>() {
			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onSuccess(List<Building> result) {
				buildings.addAll(result);
			}
	    });

		// Create a handler for the sendButton and nameField
		class MyHandler implements ClickHandler, KeyUpHandler {
			/**
			 * Fired when the user clicks on the sendButton.
			 */
			public void onClick(ClickEvent event) {
				sendNameToServer();
			}

			/**
			 * Fired when the user types in the nameField.
			 */
			public void onKeyUp(KeyUpEvent event) {
				if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
					sendNameToServer();
				}
			}

			/**
			 * Send the name from the nameField to the server and wait for a response.
			 */
			private void sendNameToServer() {
				// First, we validate the input.
				errorLabel.setText("");
				String name = nameField.getText();
				String password = passwordField.getText();
				if (!FieldVerifier.isValidName(name)) {
					errorLabel.setText("Username can not be empty");
					return;
				}

				// Then, we send the input to the server.
				sendButton.setEnabled(false);
				serverResponseLabel.setText("");

				greetingService.greetServer(name, password,
						new AsyncCallback<String>() {
							public void onFailure(Throwable caught) {
								// Show the RPC error message to the user
								dialogBox
										.setText("Remote Procedure Call - Failure");
								serverResponseLabel
										.addStyleName("serverResponseLabelError");
								String errorMessage = caught.getMessage();
								if (errorMessage.equals(LOGIN_ERROR)) {
									serverResponseLabel.setHTML(LOGIN_ERROR);
									Date now = new Date();
									long nowLong = now.getTime();
									nowLong = nowLong + (1000 * 60 * 60 * HOURS_NUMBER);
									if (loginAttempts < MAX_ATTEMTS_NUMBER) {
										loginAttempts++;
										Cookies.setCookie("invalid_login", loginAttempts.toString(), new Date(nowLong));
									} else {
										sendButton.setText("The account is locked");
										sendButton.setEnabled(false);
									}
								} else {
									serverResponseLabel.setHTML(SERVER_ERROR);
								}
								dialogBox.center();
								closeButton.setFocus(true);
							}

							public void onSuccess(String result) {
								Cookies.removeCookie("invalid_login");
				        		RootPanel.get("loginForm").addStyleName("hidden");
				        		RootPanel.get("content").removeStyleName("hidden_content");
				        		TreeItem buildingsI = new TreeItem();
				        		for (int i = 0; i < buildings.size(); i++) {
				        			Building house = buildings.get(i);
				        			TreeItem building = new TreeItem();
				        			building.setUserObject(house);
				        			building.setText(house.getStreet() + ", " + house.getNumber());
				        			if (house.getFloors().size() > 0) {
					        			for (Floor floor : house.getFloors()) {
					        				TreeItem floorItem = new TreeItem();
					        				if (floor.getId() != 0) {
						        				floorItem.setUserObject(floor);
						        				floorItem.setText(floor.getNumber().toString());
						        				building.addItem(floorItem);
					        				}
					        				List<TreeItem> items = new ArrayList<TreeItem>();
					        				if (floor.getFlats().size() > 0) {
					        					for (Flat flat : floor.getFlats()) {
					        						if (flat.getId() != 0) {
						        						TreeItem flatItem = new TreeItem();
						        						flatItem.setUserObject(flat);
						        						flatItem.setText(flat.getFlatNumber().toString());
						        						items.add(flatItem);
					        						}
					        					}
					        					Collections.sort(items, new FlatTreeItemComparator());
					        					for (TreeItem item : items) {
					        						floorItem.addItem(item);
					        					}
					        				}
					        			}
				        			}
				        			buildingsI.addItem(building);
				        		}
				        		Tree buildingsTree = new Tree();
				        		buildingsTree.addSelectionHandler(new SelectionHandler<TreeItem>() {
									@Override
									public void onSelection(SelectionEvent<TreeItem> event) {
										final TreeItem editedItem = event.getSelectedItem();
										Object userObject = event.getSelectedItem().getUserObject();
										RootPanel.get("field1").clear();
										RootPanel.get("field1_label").clear();
										RootPanel.get("field2").clear();
										RootPanel.get("field2_label").clear();
										RootPanel.get("field3").clear();
										RootPanel.get("field3_label").clear();
										RootPanel.get("field4").clear();
										RootPanel.get("save_button").clear();
										if (userObject instanceof Building) {
											Building building = (Building) event.getSelectedItem().getUserObject();
											TextBox buildingStreetField = new TextBox();
											buildingStreetField.setText(building.getStreet());
											buildingStreetField.setReadOnly(true);
											RootPanel.get("field1").add(buildingStreetField);
											RootPanel.get("field1_label").add(new Label("Street"));
											TextBox buildingNumberField = new TextBox();
											buildingNumberField.setText(building.getNumber().toString());
											buildingNumberField.setReadOnly(true);
											RootPanel.get("field2").add(buildingNumberField);
											RootPanel.get("field2_label").add(new Label("Number"));
										}
										if (userObject instanceof Floor) {
											Floor floor = (Floor) event.getSelectedItem().getUserObject();
											TextBox floorNumberField = new TextBox();
											floorNumberField.setText(floor.getNumber().toString());
											floorNumberField.setReadOnly(true);
											RootPanel.get("field1").add(floorNumberField);
											RootPanel.get("field1_label").add(new Label("Floor"));
											TextBox flatsNumberField = new TextBox();
											flatsNumberField.setText((new Integer(floor.getFlats().size())).toString());
											flatsNumberField.setReadOnly(true);
											RootPanel.get("field2").add(flatsNumberField);
											RootPanel.get("field2_label").add(new Label("Number of flats"));
										}
										if (userObject instanceof Flat) {
											Flat flat = (Flat) event.getSelectedItem().getUserObject();
											TextBox flatNumberField = new TextBox();
											flatNumberField.setText(flat.getFlatNumber().toString());
											flatNumberField.setReadOnly(true);
											RootPanel.get("field1").add(flatNumberField);
											RootPanel.get("field1_label").add(new Label("Flat"));
											final TextBox areaField = new TextBox();
											areaField.setText(flat.getArea().toString());
											RootPanel.get("field2").add(areaField);
											RootPanel.get("field2_label").add(new Label("Area"));

											final DateBox toCommissionField = new DateBox();
											DateTimeFormat dateFormat = DateTimeFormat.getFormat("yyyy-MM-dd");
											toCommissionField.setFormat(new DateBox.DefaultFormat(dateFormat));
											toCommissionField.setValue(flat.getToCommission(), true);
											RootPanel.get("field3").add(toCommissionField);
											RootPanel.get("field3_label").add(new Label("To commission"));
											final TextBox flatIdField = new TextBox();
											flatIdField.setVisible(false);
											flatIdField.setText(flat.getId().toString());
											RootPanel.get("field4").add(flatIdField);
											Button saveButton = new Button("save");
											saveButton.addClickHandler(new ClickHandler(){
												@Override
												public void onClick(ClickEvent event) {
													greetingService.saveFlat(
															new Integer(areaField.getText()),
															toCommissionField.getValue(),
															new Integer(flatIdField.getText()), 
													new AsyncCallback<String>() {
														@Override
														public void onFailure(Throwable caught) {
															DialogBox errorMessage = new DialogBox();
															errorMessage.setText("Database error: " + caught.getMessage());
															errorMessage.center();
															errorMessage.show();
														}
														@Override
														public void onSuccess(String result) {
															final String res = result;
															TreeItem parentItem = editedItem.getParentItem();
															Flat flat = (Flat) editedItem.getUserObject();
															flat.setArea(new Integer(res));
															editedItem.setUserObject(flat);
															flat.setToCommission(toCommissionField.getValue());
															List<TreeItem> items = new ArrayList<TreeItem>();
															for (int i = 0; i < parentItem.getChildCount(); i++) {
																TreeItem childItem = parentItem.getChild(i);
																Flat childItemFlat = (Flat) childItem.getUserObject();
																if (childItemFlat.getId().equals(flat.getId())) {
																	items.add(editedItem);
																} else {
																	items.add(childItem);
																}
															}
															Collections.sort(items, new FlatTreeItemComparator());
															for (TreeItem item : items) {
																parentItem.addItem(item);
															}
															final DialogBox successMessage = new DialogBox();
															successMessage.setText("Changes saved");
															successMessage.setWidth("200px");
															successMessage.setHeight("150px");
															Button closeButton = new Button("close");
															successMessage.add(closeButton);
															successMessage.center();
															successMessage.show();
															
															closeButton.addClickHandler(new ClickHandler() {
																public void onClick(ClickEvent event) {
																	successMessage.hide();
																}
															});
														}
													});
												}
											});
											RootPanel.get("save_button").add(saveButton);
										}
									}
				           		});
				        		buildingsTree.addItem(buildingsI);
				        		RootPanel.get("container1").add(buildingsTree);
							}
						});
			}
		}

		// Add a handler to send the name to the server
		MyHandler handler = new MyHandler();
		sendButton.addClickHandler(handler);
		nameField.addKeyUpHandler(handler);
	}
}

...
Рейтинг: 0 / 0
GWT: A widget that has an existing parent widget may not be added to the detach list
    #39140584
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут есть описание причин этой проблемы: http://stackoverflow.com/questions/14338875/gwt-detach-list
Но не сказано, как все-таки нужно правильно вставлять виджеты в существующие DOM-элементы.
...
Рейтинг: 0 / 0
GWT: A widget that has an existing parent widget may not be added to the detach list
    #39140588
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eklm86,

У вас ошибка не при вставке, а на RootPanel.get("container1").
Для теста, попробуйте так
Код: java
1.
2.
3.
...
RootPanel.get("content").removeStyleName("hidden_content");
RootPanel.get("container1").add(buildingsTree);
...
Рейтинг: 0 / 0
GWT: A widget that has an existing parent widget may not be added to the detach list
    #39140626
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё интересный момент... Когда я собираю проект в eclipse средствами gwt плагина - всё работает. При этом приложение деплоится просто копированием папки war в Tomcat.
Если же я собираю war-ник, то появляется эта ошибка. Плюс периодически перестают отрисовываться эти поля:
Код: java
1.
2.
3.
4.
		RootPanel.get("nameFieldContainer").add(nameField);
		RootPanel.get("passwordFieldContainer").add(passwordField);
		RootPanel.get("sendButtonContainer").add(sendButton);
		RootPanel.get("errorLabelContainer").add(errorLabel); 
...
Рейтинг: 0 / 0
GWT: A widget that has an existing parent widget may not be added to the detach list
    #39141388
eklm86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDeklm86,

У вас ошибка не при вставке, а на RootPanel.get("container1").
Для теста, попробуйте так
Код: java
1.
2.
3.
...
RootPanel.get("content").removeStyleName("hidden_content");
RootPanel.get("container1").add(buildingsTree);

Хорошо, а как это можно исправить?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / GWT: A widget that has an existing parent widget may not be added to the detach list
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]