2013-12-22 3 views
0

Мой GWT-проект - это простой календарь. Вы можете добавить дату, нажав на ячейку таблицы, которая открывает диалоговое окно для ввода имени и описания. Дата будет написана на столе, когда вы нажмете «ОК» или отмените ее с помощью «Аббречен». Мой код (сборка в Eclipse):GWT - значения ячеек после кнопки ClickEvent в целом таблице одинаковые

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.DecoratorPanel; 
import com.google.gwt.user.client.ui.DialogBox; 
import com.google.gwt.user.client.ui.Grid; 
import com.google.gwt.user.client.ui.HTMLTable; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.TextBox; 
import com.google.gwt.user.client.ui.HTMLTable.Cell; 
import com.google.gwt.user.client.ui.RootPanel; 

public class ShowCase implements EntryPoint { 
int a = 24; // Anzahl Zeit-Zeilen (Normalfall 24 -> 0:00 - 23:00) 
int start = 7; 
int end = 21; 

DecoratorPanel panel = new DecoratorPanel(); 

Grid t = new Grid((a + 1), 8); // 

String days[] = { " ", "Montag", "Dienstag", "Mittwoch", "Donnerstag", 
     "Freitag", "Samstag", "Sonntag" }; 

String data = null, str1 = null, str2 = null; 

DialogBox dialog = new DialogBox(); 
Grid dialoggrid = new Grid(3, 2); // Grid-Layout für gesamte DialogBox 
Label lname = new Label("Name"); 
Label lbeschr = new Label("Beschreibung"); 
TextBox tbname = new TextBox(); 
TextBox tbbeschr = new TextBox(); 
Button ok = new Button("OK"); 
Button cancel = new Button("Abbrechen"); 

int indexrow, indexcol; 

DialogBox leer = new DialogBox(); 
Button okleer = new Button("OK"); 

public void onModuleLoad() { 
    t.setBorderWidth(1); 
    t.setCellSpacing(0); 
    for (int row = 0; row < (a + 1); row++) { 
     for (int col = 0; col < 8; col++) { 
      if (col == 0) { 
       int z = row - 1; 
       System.out.println("Spalte 0 Zeit setzen: " + row); 
       t.setText(row, col, z + ":00"); // Spalte 0 Zeit setzen 
      } else { 
       t.setText(row, col, ""); 
      } 

      t.setText(0, col, days[col]); // Tage aus days in Zeile 0 setzen 
      t.getCellFormatter().setWidth(row, 0, "50px"); 
      t.getCellFormatter().setWidth(row, col, "150px"); 
     } 
    } // end for(int row=0...) 

    panel.add(t); 
    RootPanel.get("content").add(panel); 

    t.addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      System.out.println("Neuer Klick!"); 
      Cell cell = ((HTMLTable) event.getSource()).getCellForEvent(event); 
      System.out.println("Cell cell HTML Table"); 

      /*if (data.equals("1")){ 
        tbname.setText(text); 
        tbbeschr.setText(null); 
      }*/ 

      System.out.println("data1: " + data); 
      // Uhrzeit-Spalte und Wochentagsreihe absichern 
      if(!(cell.getRowIndex() == 0) && !(cell.getCellIndex() ==0)){ 
       System.out.println("Get Index(): " + cell.getRowIndex() + "," + cell.getCellIndex()); // Ausgabe von Reihe und Spalte 
       final int indexrow = cell.getRowIndex(); 
       final int indexcol = cell.getCellIndex(); 




       // Dialog belegen und anzeigen 
       dialoggrid.setCellSpacing(0); 
       dialoggrid.setCellPadding(0); 

       tbname.setText(null); 
       tbbeschr.setText(null); 

       System.out.println("TBName: " + tbname.getText()); 
       System.out.println("TBBeschr: " + tbbeschr.getText()); 

       dialoggrid.setWidget(0, 0, lname); 
       dialoggrid.setWidget(1, 0, lbeschr); 
       dialoggrid.setWidget(2, 0, ok); 

       dialoggrid.setWidget(0, 1, tbname); 
       dialoggrid.setWidget(1, 1, tbbeschr); 
       dialoggrid.setWidget(2, 1, cancel); 


       dialog.setWidget(dialoggrid); 
       dialog.center(); 
       dialog.setModal(false); 

       if(tbname.getText().equals(null)){ 
        System.out.println("if tbname.getText equals null"); 
       } 


       System.out.println("Dialog show"); 
       dialog.show(); 

       ok.addClickHandler(new ClickHandler() { 
        public void onClick(ClickEvent event) { 
         System.out.println("ok Click"); 
         // Überprüfen ob TextBox Name und Beschreibung nicht leer sind 
         if ((!tbname.getText().equals(null)) && (!tbbeschr.getText().equals(null))) { 
          System.out.println("Wenn tbname & tbbeschr nicht leer sind"); 
          str1 = tbname.getText(); 
          str2 = tbbeschr.getText(); 
          data = str1 + ", " + str2; 
          t.setText(indexrow, indexcol, data); 
          dialog.hide(); 
          System.out.println("#1: "+data+"#"); 
          data = null; 
          System.out.println("#2: "+data+"#"); 
         } else { 
          System.out.println("leer!"); 
          leer.setText("Felder duerfen nicht leer sein!"); 
          leer.add(okleer); 
          leer.center(); 
          leer.setModal(true); 
          leer.show(); 

          okleer.addClickHandler(new ClickHandler(){ 
           public void onClick(ClickEvent event){ 
            System.out.println("okleer click"); 
            leer.hide(); 
           } 
          }); 
         } // end else 

        } 
       }); // end ok.addClickHandler 

       cancel.addClickHandler(new ClickHandler() { 
        public void onClick(ClickEvent event) { 
         System.out.println("cancel Click"); 
         dialog.hide(); 
         tbname.setText(null); 
         tbbeschr.setText(null); 
        } 
       }); // end cancel.addClickHandler 

      } // end if(!(cellindex) && !(rowindex) =0) 

     } // end public void OnClick() 
    }); // end t.addClickHandler 
} // end onModuleLoad(} 

Проблема заключается в том, что, введя описание имя & в диалоговом окне и нажмите кнопку «OK», он переписывает все кликали клетки (также аннулированные диалоговые клетки) с значения из моего текущего диалога. Некоторые testcases с выходом в консоль (OK-Click это делает еще более OK щелкает для каждой щелкнул ячейки):

Neuer Klick! 
Cell cell HTML Table 
data1: null 
Get Index(): 1,1 
TBName: 
TBBeschr: 
Dialog show 
ok Click 
Wenn tbname & tbbeschr nicht leer sind 
#1: rt, qw# 
#2: null# 
Neuer Klick! 
Cell cell HTML Table 
data1: null 
Get Index(): 1,2 
TBName: 
TBBeschr: 
Dialog show 
ok Click 
Wenn tbname & tbbeschr nicht leer sind 
#1: gh, tz# 
#2: null# 
ok Click 
Wenn tbname & tbbeschr nicht leer sind 
#1: gh, tz# 
#2: null# 

Почему? Или есть лучшая возможность «управлять» кодом?

ответ

0

Вам необходимо использовать HandlerRegistration для вашего обработчика Click. Как вы не очищая обработчик щелчка, поэтому он называет ранние события также ..

см ниже ссылки для получения более подробной информации:

GWT HandlerRegistration

similar issue

кажется вам являются совершенно новыми для GWT. Вот рабочее решение:

package com.my.first.client;

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.event.shared.HandlerRegistration; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.DecoratorPanel; 
import com.google.gwt.user.client.ui.DialogBox; 
import com.google.gwt.user.client.ui.Grid; 
import com.google.gwt.user.client.ui.HTMLTable; 
import com.google.gwt.user.client.ui.HTMLTable.Cell; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.TextBox; 

/** 
* Entry point classes define <code>onModuleLoad()</code>. 
*/ 
public class ShowCase implements EntryPoint { 
    int a = 24; // Anzahl Zeit-Zeilen (Normalfall 24 -> 0:00 - 23:00) 
    int start = 7; 
    int end = 21; 

    DecoratorPanel panel = new DecoratorPanel(); 

    Grid t = new Grid((a + 1), 8); // 

    String days[] = { " ", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag" }; 

    String data = null, str1 = null, str2 = null; 

    DialogBox dialog = new DialogBox(); 
    Grid dialoggrid = new Grid(3, 2); // Grid-Layout für gesamte DialogBox 
    Label lname = new Label("Name"); 
    Label lbeschr = new Label("Beschreibung"); 
    TextBox tbname = new TextBox(); 
    TextBox tbbeschr = new TextBox(); 
    Button ok = new Button("OK"); 
    Button cancel = new Button("Abbrechen"); 

    HandlerRegistration okHandlerRegistration; 

    int indexrow, indexcol; 

    DialogBox leer = new DialogBox(); 
    Button okleer = new Button("OK"); 

    public void onModuleLoad() { 
     t.setBorderWidth(1); 
     t.setCellSpacing(0); 
     for (int row = 0; row < (a + 1); row++) { 
      for (int col = 0; col < 8; col++) { 
       if (col == 0) { 
        int z = row - 1; 
        System.out.println("Spalte 0 Zeit setzen: " + row); 
        t.setText(row, col, z + ":00"); // Spalte 0 Zeit setzen 
       } else { 
        t.setText(row, col, ""); 
       } 

       t.setText(0, col, days[col]); // Tage aus days in Zeile 0 setzen 
       t.getCellFormatter().setWidth(row, 0, "50px"); 
       t.getCellFormatter().setWidth(row, col, "150px"); 
      } 
     } // end for(int row=0...) 

     panel.add(t); 
     RootPanel.get("content").add(panel); 

     t.addClickHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) { 

       System.out.println("Neuer Klick!"); 
       Cell cell = ((HTMLTable) event.getSource()).getCellForEvent(event); 
       System.out.println("Cell cell HTML Table"); 

       /* 
       * if (data.equals("1")){ tbname.setText(text); 
       * tbbeschr.setText(null); } 
       */ 

       System.out.println("data1: " + data); 
       // Uhrzeit-Spalte und Wochentagsreihe absichern 
       if (!(cell.getRowIndex() == 0) && !(cell.getCellIndex() == 0)) { 
        System.out.println("Get Index(): " + cell.getRowIndex() + "," + cell.getCellIndex()); // Ausgabe 
                              // von 
                              // Reihe 
                              // und 
                              // Spalte 
        final int indexrow = cell.getRowIndex(); 
        final int indexcol = cell.getCellIndex(); 

        // Dialog belegen und anzeigen 
        dialoggrid.setCellSpacing(0); 
        dialoggrid.setCellPadding(0); 

        tbname.setText(null); 
        tbbeschr.setText(null); 

        System.out.println("TBName: " + tbname.getText()); 
        System.out.println("TBBeschr: " + tbbeschr.getText()); 

        dialoggrid.setWidget(0, 0, lname); 
        dialoggrid.setWidget(1, 0, lbeschr); 
        dialoggrid.setWidget(2, 0, ok); 

        dialoggrid.setWidget(0, 1, tbname); 
        dialoggrid.setWidget(1, 1, tbbeschr); 
        dialoggrid.setWidget(2, 1, cancel); 

        dialog.setWidget(dialoggrid); 
        dialog.center(); 
        dialog.setModal(false); 

        if (tbname.getText().equals(null)) { 
         System.out.println("if tbname.getText equals null"); 
        } 

        System.out.println("Dialog show"); 
        dialog.show(); 

        if (okHandlerRegistration != null) { 
         okHandlerRegistration.removeHandler(); 
        } 

        okHandlerRegistration = ok.addClickHandler(new ClickHandler() { 
         public void onClick(ClickEvent event) { 
          System.out.println("ok Click"); 
          // Überprüfen ob TextBox Name und Beschreibung nicht 
          // leer sind 
          if ((!tbname.getText().equals(null)) && (!tbbeschr.getText().equals(null))) { 
           System.out.println("Wenn tbname & tbbeschr nicht leer sind"); 
           str1 = tbname.getText(); 
           str2 = tbbeschr.getText(); 
           data = str1 + ", " + str2; 
           t.setText(indexrow, indexcol, data); 
           dialog.hide(); 
           System.out.println("#1: " + data + "#"); 
           data = null; 
           System.out.println("#2: " + data + "#"); 
          } else { 
           System.out.println("leer!"); 
           leer.setText("Felder duerfen nicht leer sein!"); 
           leer.add(okleer); 
           leer.center(); 
           leer.setModal(true); 
           leer.show(); 

           okleer.addClickHandler(new ClickHandler() { 
            public void onClick(ClickEvent event) { 
             System.out.println("okleer click"); 
             leer.hide(); 
            } 
           }); 
          } // end else 

         } 
        }); // end ok.addClickHandler 

        cancel.addClickHandler(new ClickHandler() { 
         public void onClick(ClickEvent event) { 
          System.out.println("cancel Click"); 
          dialog.hide(); 
          tbname.setText(null); 
          tbbeschr.setText(null); 
         } 
        }); // end cancel.addClickHandler 

       } // end if(!(cellindex) && !(rowindex) =0) 

      } // end public void OnClick() 
     }); // end t.addClickHandler 
    } // end onModuleLoad(} 

} 
+0

спасибо. Я попробовал, но это не помогло. :/ – quantatheist

+0

см. Мой обновленный ответ – dhamibirendra

+0

Извините, я забыл свое сообщение. : D С Рождеством. Спасибо, теперь он работает правильно. Я попробовал что-то вроде того, что вы сделали (прошу, забыл рассказать, что я сделал), но это было неправильно (бежать только один раз). И да, я очень новичок в GWT. Другой вопрос: какая база данных - хороший способ сохранить и загрузить значения? Спасибо за вашу помощь, и я желаю вам нового года. :) – quantatheist

Смежные вопросы