2016-11-28 1 views
1

Dans mon application, j'ai un super utilisateur qui peut gérer l'ensemble du logiciel. Lorsque l'utilisateur connecté est l'administrateur, il peut voir quelques boutons pour le faire (gérer). Le problème est avec l'un de ce bouton, le bouton d'administration, que lorsqu'il est tiré, il doit montrer un div caché et charger à l'intérieur de lui quelques boutons. Quand je clique sur le bouton "administration" il charge seulement le div et si je le clique de nouveau il charge le reste du code (les boutons) et obtient le blocage.Gwt bouton besoin d'un double clic pour charger toutes les données dans un div

Je pense que le DOM.getElementById("center_top").getStyle().setDisplay(Display.BLOCK); bloque le reste du code et j'ai besoin d'un autre clic pour charger les boutons.

Voici le code de la méthode:

package com.unibo.questionandanswer.client.view; 

import java.util.List; 

import com.google.gwt.core.client.GWT; 
import com.google.gwt.dom.client.Document; 
import com.google.gwt.dom.client.Style.Display; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.DOM; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.DialogBox; 
import com.google.gwt.user.client.ui.FlowPanel; 
import com.google.gwt.user.client.ui.HTML; 
import com.google.gwt.user.client.ui.HasHorizontalAlignment; 
import com.google.gwt.user.client.ui.HorizontalPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.unibo.questionandanswer.client.CategoriesInterface; 
import com.unibo.questionandanswer.client.QuestionAndAnswer; 
import com.unibo.questionandanswer.client.UsersService; 
import com.unibo.questionandanswer.client.UsersServiceAsync; 
import com.unibo.questionandanswer.shared.User; 
import com.unibo.questionandanswer.shared.UserRights; 

/** 
* 
* @author Dario 
* 
*/ 
public class AdminController { 

    UserRights rightsFilter = UserRights.USER; 

    private final UsersServiceAsync usersService = GWT 
      .create(UsersService.class); 

    private QuestionAndAnswer controller; 

    public AdminController(CategoriesInterface categorie) { 

     if (categorie instanceof QuestionAndAnswer) { 
      this.controller = (QuestionAndAnswer) categorie.getController(); 
     } 

     amministraSito(); 

    } 

    @SuppressWarnings("deprecation") 
    private void amministraSito() { 

     // Bottone per l'admin gestione software 
     final Button amministra = new Button("Amministra"); 
     final Button sitoNormale = new Button("Q&A Sito"); 

     RootPanel.get("top_header").add(amministra); 
     RootPanel.get("top_header").add(sitoNormale); 
     DOM.setElementAttribute(amministra.getElement(), "id", 
       "amministraButton"); 
     DOM.setElementAttribute(sitoNormale.getElement(), "id", 
       "backSitoButton"); 

     /** 
     * Esce dalla modalità amministra 
     */ 
     sitoNormale.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       controller.setSelectedImpostaCat(false); 
       amministra.setEnabled(true); 
       sitoNormale.setEnabled(false); 
       Window.Location.reload(); 

      } 
     }); 

     /** 
     * Entra in modalità amministra 
     */ 
     amministra.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 

       // RootPanel.get("center").clear(); 
       // DOM.getElementById("center_top").getStyle().setDisplay(Display.BLOCK); 
       Document.get().getElementById("center_top").getStyle() 
         .setDisplay(Display.BLOCK); 
       RootPanel.get("center_top").clear(); 
       // Util per promuovere giudici o rimuoverli 
       giudiceUtil(); 
       // Util per rimuovere una risposta 
       removeAnswerUtil(); 
       // Util per rimuovere una domanda 
       removeQuestionUtil(); 
       // Util per modificare le categorie 
       mangeTreeUtil(); 

       amministra.setEnabled(false); 
       sitoNormale.setEnabled(true); 

      } 
     }); 

    } 

    /** 
    * Metodo che permette all'admin di modificare le categorie 
    */ 
    private void mangeTreeUtil() { 

     // Bottone per l'admin gestione software 
     final Button manageTree = new Button("Imposta categorie"); 

     RootPanel.get("center_top").add(manageTree); 

     manageTree.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       RootPanel.get("center").clear(); 
       controller.setSelectedImpostaCat(true); 
       controller.buildAdminTree(); 
      } 
     }); 
    } 

    /** 
    * Metodo che permette all'admin di rimuovere una domanda 
    */ 
    private void removeQuestionUtil() { 

    } 

    /** 
    * Metodo che permette all'admin di rimuovere una risposta 
    */ 
    private void removeAnswerUtil() { 

    } 

    /** 
    * Metodo che permette all'admi di selezionare un giudice o rimuoverlo 
    */ 
    private void giudiceUtil() { 

     // Bottone per inviare dati login al server-side 
     final Button showUsers = new Button("All Users"); 

     RootPanel.get("center_top").add(showUsers); 

     showUsers.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 

       controller.setSelectedImpostaCat(false); 
       showAllRegisterdUsers(); 

      } 
     }); 

    } 

    /** 
    * Metodo che motra tutti gli utenti registrati 
    */ 
    private void showAllRegisterdUsers() { 

     usersService.registeredUsers(new AsyncCallback<List<User>>() { 

      @Override 
      public void onFailure(Throwable caught) { 
       String alert = "Errore in fase di registrazione"; 
       for (StackTraceElement el : caught.getStackTrace()) 
        alert += "\n" + el.toString(); 

       Window.alert(alert); 
      } 

      @Override 
      public void onSuccess(List<User> result) { 

       RootPanel.get("center").clear(); 

       final Button users = new Button("Users"); 
       final Button giudici = new Button("Giudici"); 
       HorizontalPanel buttonFilter = new HorizontalPanel(); 

       buttonFilter.add(users); 
       buttonFilter.add(giudici); 

       RootPanel.get("center").add(buttonFilter); 

       // Codice HTML che spiega il funzionamento del come fare 
       HorizontalPanel hp = new HorizontalPanel(); 
       HTML html = new HTML(
         "<p style='margin-left: 20px'>Selezionare il nome utente per cambiare i suoi diritti da USER a GIUDICE e viceversa!</p><hr>"); 
       hp.add(html); // adds the widget to the panel 

       RootPanel.get("center").add(hp); 

       users.addClickHandler(new ClickHandler() { 

        @Override 
        public void onClick(ClickEvent event) { 

         rightsFilter = UserRights.USER; 
         showAllRegisterdUsers(); 
         controller.setSelectedImpostaCat(false); 

        } 
       }); 

       giudici.addClickHandler(new ClickHandler() { 

        @Override 
        public void onClick(ClickEvent event) { 

         rightsFilter = UserRights.GIUDICE; 
         showAllRegisterdUsers(); 
         controller.setSelectedImpostaCat(false); 

        } 
       }); 

       for (User curr : result) { 

        if (curr.get_userRight().equals(rightsFilter)) { 

         // Label per il dialog promozione a giudice 
         final Label textDialogGiud = new Label(
           "Promuovere l'utente a Giudice?"); 
         // Label per il dialog declassa a user 
         final Label textDialogGiudRemove = new Label(
           "Declassare l'utente a User?"); 

         // Bottone per promuovere user 
         final Button promuovi = new Button("Promuovi!"); 
         // Bottone per declassare user 
         final Button declassa = new Button("Declassa!"); 
         // Bottone per chiudere la dialog 
         final Button closeWindow = new Button("Chiudi"); 

         // promuovi.getElement().setId("promuoviUser"); 
         closeWindow.getElement().setId("chiudiDialog"); 

         HorizontalPanel lineDialogText = new HorizontalPanel(); 
         HorizontalPanel controllButtonsDialog = new HorizontalPanel(); 
         FlowPanel flowPanelGiudice = new FlowPanel(); 

         // Se l'utente selezionato è giudice carico i pulsanti 
         // per declassare 
         if (curr.get_userRight().equals(UserRights.GIUDICE)) { 

          controllButtonsDialog.add(declassa); 
          lineDialogText.add(textDialogGiudRemove); 

         } else if (curr.get_userRight().equals(UserRights.USER)) { 
          // Se l'utente selezionato è user carico i pulsanti 
          // per promuovere 
          controllButtonsDialog.add(promuovi); 
          lineDialogText.add(textDialogGiud); 

         } 

         // lineDialogText.add(textDialogGiud); 
         // controllButtonsDialog.add(promuovi); 
         controllButtonsDialog.add(closeWindow); 
         // Carico gli horizontal panel con i label e button che 
         // mi servono 
         // in base allo user 
         flowPanelGiudice.add(lineDialogText); 
         flowPanelGiudice.add(controllButtonsDialog); 

         final DialogBox dialogSelectGiud = new DialogBox(); 

         dialogSelectGiud.setAnimationEnabled(true); 

         dialogSelectGiud.setWidget(flowPanelGiudice); 

         final HorizontalPanel userPanel = new HorizontalPanel(); 
         final Label username = new Label(curr.getUsername()); 

         // Handler che gestisce la gestione del click sulla 
         // lista 
         // di utenti o giudici 
         username.addClickHandler(new ClickHandler() { 

          @Override 
          public void onClick(ClickEvent event) { 

           dialogSelectGiud.setText("Selezionato: " 
             + username.getText().toString()); 
           dialogSelectGiud.center(); 
           dialogSelectGiud.show(); 

          } 
         }); 

         userPanel.add(username); 
         RootPanel.get("center").add(userPanel); 

         /* 
         * BUTTON PROMUOVI UTENTE 
         */ 
         promuovi.addClickHandler(new ClickHandler() { 

          @Override 
          public void onClick(ClickEvent event) { 

           dialogSelectGiud.hide(); 

           usersService.findUser(username.getText() 
             .toString(), new AsyncCallback<User>() { 

            @Override 
            public void onFailure(Throwable caught) { 

             Window.alert("Errore nel trovare lo User!"); 

            } 

            @Override 
            public void onSuccess(User result) { 

             result.set_userRight(UserRights.GIUDICE); 

             usersService.changeUserRights(result, 
               new AsyncCallback<Void>() { 

                @Override 
                public void onFailure(
                  Throwable caught) { 

                 Window.alert("Errore nella promozione utente!"); 

                } 

                @Override 
                public void onSuccess(
                  Void result) { 

                 Window.alert("Utente promosso a giudice! " 
                   + username 
                     .getText() 
                     .toString()); 

                 showAllRegisterdUsers(); 

                } 
               }); 

            } 
           }); 

          } 
         }); 

         /* 
         * BUTTON DECLASSA UTENTE 
         */ 
         declassa.addClickHandler(new ClickHandler() { 

          @Override 
          public void onClick(ClickEvent event) { 

           dialogSelectGiud.hide(); 

           usersService.findUser(username.getText() 
             .toString(), new AsyncCallback<User>() { 

            @Override 
            public void onFailure(Throwable caught) { 

             Window.alert("Errore nel trovare lo User!"); 

            } 

            @Override 
            public void onSuccess(User result) { 

             result.set_userRight(UserRights.USER); 

             usersService.changeUserRights(result, 
               new AsyncCallback<Void>() { 

                @Override 
                public void onFailure(
                  Throwable caught) { 

                 Window.alert("Errore nel declassare l'utente!"); 

                } 

                @Override 
                public void onSuccess(
                  Void result) { 

                 Window.alert("Utente declassato a user! " 
                   + username 
                     .getText() 
                     .toString()); 

                 showAllRegisterdUsers(); 

                } 
               }); 

            } 
           }); 

          } 
         }); 

         /* 
         * BUTTON CHIUDI DIALOG PROMOZIONE 
         */ 
         closeWindow.addClickHandler(new ClickHandler() { 

          @Override 
          public void onClick(ClickEvent event) { 

           dialogSelectGiud.hide(); 

          } 
         }); 

         /* 
         * QUALCHE CSS PER BUTTONS 
         */ 
         userPanel.getElement().setAttribute("style", 
           "margin: auto; padding: 10px"); 
         users.getElement().setAttribute("style", 
           "margin: 5px 0 5px 5px;"); 
         giudici.getElement().setAttribute("style", 
           "margin: 5px 0 5px 5px; "); 

         //CSS per bottoni dentro dialogbox 
         controllButtonsDialog.setWidth("100%"); 
         controllButtonsDialog.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); 

         promuovi.getElement().setAttribute("style", 
           "margin: 20px 5px 5px 5px; float: left;"); 
         declassa.getElement().setAttribute("style", 
           "margin: 20px 5px 5px 5px; float: left;"); 
         closeWindow.getElement().setAttribute("style", 
           "margin: 20px 5px 5px 5px; float: right;"); 

        } 
       } 
      } 
     }); 

    } 

} 

Et voici le css qui cache la "center_top" div

#center_top{ 
    position: absolute; 
    top: 0; 
    width: 100%; 
    height: 30px; 
    border-bottom:1px solid black; 
    display: none; 

} 

Pourquoi seulement avec ce bouton i besoin d'un double-clic montrer div et charger les boutons à l'intérieur?

Le DOM.getElementById bloque l'exécution du code?

La console du navigateur unrlined cette ligne de code

/** 
    * Adds a widget to the detach list. This is the list of widgets to be 
    * detached when the page unloads. 
    * 
    * <p> 
    * This method must be called for all widgets that have no parent widgets. 
    * These are most commonly {@link RootPanel RootPanels}, but can also be any 
    * widget used to wrap an existing element on the page. Failing to do this may 
    * cause these widgets to leak memory. This method is called automatically by 
    * widgets' wrap methods (e.g. 
    * {@link Button#wrap(com.google.gwt.dom.client.Element)}). 
    * </p> 
    * 
    * <p> 
    * This method may <em>not</em> be called on any widget whose element is 
    * contained in another widget. This is to ensure that the DOM and Widget 
    * hierarchies cannot get into an inconsistent state. 
    * </p> 
    * 
    * @param widget the widget to be cleaned up when the page closes 
    * @see #detachNow(Widget) 
    */ 
    public static void detachOnWindowClose(Widget widget) { 
    assert !widgetsToDetach.contains(widget) : "detachOnUnload() called twice " 
     + "for the same widget"; 
    assert !isElementChildOfWidget(widget.getElement()) : "A widget that has " 
     + "an existing parent widget may not be added to the detach list"; 

    widgetsToDetach.add(widget); 
    } 
+0

Si vous pouvez cliquer sur le bouton la deuxième fois, cela signifie qu'il est toujours activé. Donc votre code n'atteint pas la ligne 'amministra.setEnabled (false); Vous devriez vérifier la console d'erreur dans votre navigateur. – Adam

+0

ajouté l'erreur de la console du navigateur, pouvez-vous m'aider à le comprendre? – Dario

Répondre

1

Ainsi, vous obtenez une erreur lors de l'ajout d'un widget à la liste des Détacher.

Vous devez d'abord savoir quelle est la liste de détachement. Il est expliqué dans le commentaire à la méthode detachOnWindowClose. Je vais essayer d'expliquer cela d'une manière plus simple.

Chaque fois que vous utilisez un widget affiché sur la page, le widget crée une structure DOM (Document Object Model) et s'y connecte. Par exemple, le widget a le code pour les gestionnaires d'événements. GWT doit garder le contrôle sur cette connexion, donc lorsque le DOM est supprimé (par exemple la page est effacée ou déchargée - en général détaché) il peut libérer la mémoire utilisée par les précédents gestionnaires d'événements (ou d'autres ressources). Sinon, cela pourrait entraîner une fuite de mémoire.

Widgets doit être ajouté à la liste des Détacher quand ils ont pas widgets parents

  • lorsque vous ajoutez directement un widget au DOM par le RootPanel (RootPanel.get().add(widget); ou juste RootPanel.get("element_id");)
  • lorsque vous enveloppez le widget autour de l'élément DOM existant (Panel.wrap(element);)

Les widgets contenus dans d'autres widgets sont détachés par le widget parent.


Si vous obtenez une erreur lors de l'ajout d'un widget à la liste Détacher cela pourrait signifier que vous rencontrez l'une des deux conditions suivantes:

  • le widget est déjà dans la liste des Détacher
  • vous essayez pour créer un widget avec l'élément DOM qui fait partie d'un autre widget.

Vous devez savoir que lorsque vous appelez RootPanel.get("center_top"); vous utilisez réellement les RootPanel de widgets liés à l'élément DOM avec center_top id. Cela signifie que la prochaine fois que vous appelez RootPanel.get("center_top");, vous obtiendrez une erreur, car il serait déjà dans la liste de détachement. En outre, si vous appelez RootPanel.get(id); avec l'ID de l'élément contenu dans l'élément center_top, vous obtiendrez également une erreur, car il aurait déjà un widget parent créé par le premier appel de la méthode RootPanel.get("center_top");.


J'espère que maintenant vous avez l'idée de ce que la liste des Détacher est et j'espère aussi que je ne serais pas vers le bas-voté pour cette explication simplifiée;)


Maintenant, revenons à votre problème. Je suppose que l'une des méthodes giudiceUtil();, removeAnswerUtil();, removeQuestionUtil(); ou mangeTreeUtil(); répond aux conditions pour générer une erreur mentionnée ci-dessus. Vous pouvez vous déplacer en réutilisant RootPanel s une fois créé par les appels précédents (n'appelez pas RootPanel.get() avec le même identifiant deux fois) ou en les créant dans l'ordre ascendant (cela signifie que vous obtenez d'abord un RootPanel d'élément enfant et ensuite l'élément parent).

À la votre!

+0

Merci pour votre explication, un autre point de vue est toujours accepté de ma part: D. Dans 'giudiceUtil()' et 'manageTreeUtil()', tous deux appellent la méthode 'RootPanel.get (" center_top ")' pour positionner les éléments (élément différent). Donc le problème est que j'appelle non seulement 1 fois le 'RootPanel.get()', mais je l'appelle 3 fois et j'obtiens ces erreurs? J'essaie un peu de changement, si je résous le problème je vérifie ta réponse! Maintenant, j'ai upvote cela pour l'explication;) – Dario

+0

Quoi qu'il en soit, j'ai commenté les fonctions 'giudiceUtil()' et 'mangetreeUtil()' et le problème reste encore .... donc ils ne sont pas le problème ... je tente d'éditer le poster avec plus de code peut-être vous pouvez voir le problème facile: D Édité le code java! – Dario