GET - 整个表中按钮单击事件后的单元格值相同

时间:2013-12-22 16:09:29

标签: gwt

我的GWT项目是一个简单的日历。您可以通过单击表格单元格来添加日期,该表格单元格将打开一个对话框以输入名称和说明。 当您点击" OK"时,该日期将写入表格单元格。或者取消" Abbrechen"。 我的代码(在Eclipse中构建):

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(}

问题是,输入名称&amp;在对话框中单击描述并单击&#34;确定&#34;,它将使用当前对话框中的值覆盖所有单击的单元格(也包括已取消的对话框单元格)。 一些在控制台中具有输出的测试用例(通过OK-Click,它为每个单击的单元格提供更多OK-Clicks):

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#

为什么呢?或者是否有更好的可能性来管理&#34;代码?

1 个答案:

答案 0 :(得分:0)

您需要为Click处理程序使用HandlerRegistration。由于您没有清除点击处理程序,因此它也在调用之前的事件..

有关详细信息,请参阅以下链接:

GWT HandlerRegistration

similar issue

看来你对GWT来说还是个新手。这是工作解决方案:

包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(}

}