Удалить строку из flexTable в GWT

Я изучаю GWT

В первой строке flexTable я добавил поле со списком, поле со списком, текстовое поле, кнопку AddButton, кнопку «Удалить».

При событии щелчка addButton 2 строка добавляется в flexTable с тем же компонентом, что и первая. (поле со списком, поле со списком, текстовое поле, кнопка AddButton, кнопка «Удалить».)

и так далее.

теперь мне нужно написать код для удаления строки в событии щелчка removeButton

введите описание изображения здесьпри нажатии на любую кнопку добавления добавляется аналогичная строка.

теперь то, что я хочу, - это когда я нажимаю кнопку удаления, чтобы удалить ту же строку, чтобы удалить

Как это сделать.


Отредактировано

public class AdvancePropertySearch extends Composite{
// initialization
    public AdvancePropertySearch() {
        initWidget(getFlexTable());
    }

    private FlexTable getFlexTable() {
        if (flexTable == null) {
            flexTable = new FlexTable();
            flexTable.setWidth("1033px");
            flexTable.setHeight("100%");
            flexTable.setWidget(0, 0, getPropertyList());
            flexTable.setWidget(0, 1, getConditionList());
            flexTable.setWidget(0, 2, getKeyWord());
            flexTable.setWidget(0, 3, getAddbutton());
            flexTable.setWidget(0, 4, getRemove());
        }
        return flexTable;
    }
    private ListBox getPropertyList() {

            propertyList = new ListBox();
            propertyList.setWidth("297px");

        return propertyList;
    }
    private ListBox getConditionList() {

            conditionList = new ListBox();
            conditionList.setWidth("311px");

        return conditionList;
    }
    private TextBox getKeyWord() {

            keyWord = new TextBox();

        return keyWord;
    }
    private Button getAddbutton() {

            addbutton = new Button("");
            addbutton.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    int i = flexTable.getRowCount();
                    flexTable.setWidget(i, 0, getPropertyList());
                    flexTable.setWidget(i, 1, getConditionList());
                    flexTable.setWidget(i, 2, getKeyWord());
                    flexTable.setWidget(i, 3, getAddbutton());

                    flexTable.setWidget(i, 4, getRemove());
                    remove.setStyleName("cmis-Button-removeOn");

                }
            });
            addbutton.setSize("25px", "25px");
            addbutton.setStyleName("cmis-Button-Add");

        return addbutton;
    }
    private Button getRemove() {

            remove = new Button("");
            remove.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {

                    TableRowElement tablerow = findNearestParentRow(remove.getElement());
                    flexTable.removeRow(tablerow.getRowIndex());
                }
            });
            remove.setSize("25px", "25px");
            remove.setStyleName("cmis-Button-removeOff");

        return remove;
    }

ошибка

com.google.gwt.event.shared.UmbrellaException: One or more exceptions caught, see full set in UmbrellaException#getCauses
    at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:129)
    at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129)
    at com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116)
    at com.google.gwt.user.client.ui.Widget.onBrowserEvent(Widget.java:177)
    at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351)
    at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1307)
    at sun.reflect.GeneratedMethodAccessor49.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
    at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
    at java.lang.Thread.run(Thread.java:662)
Caused by: com.google.gwt.dev.shell.HostedModeException: Something other than a short was returned from JSNI method '@com.google.gwt.dom.client.Node::getNodeType()': JS value of type undefined, expected short
    at com.google.gwt.dev.shell.JsValueGlue.getIntRange(JsValueGlue.java:266)
    at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:154)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeShort(ModuleSpace.java:279)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeShort(JavaScriptHost.java:99)
    at com.google.gwt.dom.client.Node$.getNodeType$(Node.java)
    at com.client.GUI.AdvancePropertySearch.findNearestParentNodeByType(AdvancePropertySearch.java:136)
    at com.client.GUI.AdvancePropertySearch.findNearestParentRow(AdvancePropertySearch.java:104)
    at com.client.GUI.AdvancePropertySearch$2.onClick(AdvancePropertySearch.java:90)
    at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:54)
    at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:1)
    at com.google.gwt.event.shared.GwtEvent.dispatch(GwtEvent.java:1)
    at com.google.web.bindery.event.shared.EventBus.dispatchEvent(EventBus.java:40)
    at com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:193)
    at com.google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88)
    at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:127)
    at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129)
    at com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116)
    at com.google.gwt.user.client.ui.Widget.onBrowserEvent(Widget.java:177)
    at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351)
    at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1307)
    at sun.reflect.GeneratedMethodAccessor49.invoke(Unknown Source)

person GameBuilder    schedule 10.07.2012    source источник


Ответы (2)


Когда вы поймаете событие onClick с помощью кнопки «удалить», вам нужно выяснить, в какой строке вы находитесь, поэтому для поиска ближайшей строки вы можете использовать функцию ниже (в отношении у вас нет таблицы в вашей ячейке с кнопкой «удалить» ):

 public static TableRowElement findNearestParentRow(Node node)
{
    Node element = findNearestParentNodeByType(node, "tr");
    if (element != null)
    {
        return element.cast();
    }
    return null;
}

public static Node findNearestParentNodeByType(Node node, String nodeType)
{
    while ((node != null))
    {
        if (Element.is(node))
        {
            Element elem = Element.as(node);

            String tagName = elem.getTagName();

            if (nodeType.equalsIgnoreCase(tagName))
            {
                 return elem.cast();
            }

        }
        node = node.getParentNode();
    }
    return null;
}

В вашем onClick вы можете получить rowId:

TableRowElement tableRow = findNearestParentRow(removeButton.getElement());
flexTable.removeRow(tableRow.getRowIndex());
person Alexey A.    schedule 10.07.2012
comment
String ... означает, что мы можем передать несколько строк, это сделано для таких случаев, когда вы хотите найти не точный тег, а что-то вроде td, th, но в вашем случае вы можете опустить это и оставить только один аргумент String. - person Alexey A.; 11.07.2012
comment
: ok .. при нажатии на кнопку removeButton строка удаляется. но когда я нажимаю другую кнопку удаления, это вызывает у меня ошибку `Вызвано: com.google.gwt.dev.shell.HostedModeException: из метода JSNI @ com.google.gwt.dom.client было возвращено что-то отличное от int. TableRowElement :: getRowIndex () ': значение JS типа undefined, ожидаемое int` в flexTable.removeRow(tablerow.getRowIndex()); - person GameBuilder; 11.07.2012
comment
существует проблема с режимом отладки в chrome, поэтому, если эта ошибка появляется время от времени, все будет работать гладко после компиляции приложения. - person Alexey A.; 11.07.2012
comment
для тестирования я бы рекомендовал использовать firefox, плагин gwt намного стабильнее. - person Alexey A.; 11.07.2012
comment
Я использую Mozilla .. Я отредактировал и добавил код и трассировку стека. пожалуйста, посмотрите и помогите мне. Когда я нажимаю на любую кнопку removeButton, удаляется lastRow гибкой таблицы. Если я нажму второй раз на любую кнопку удаления. это дает мне ошибку. - person GameBuilder; 12.07.2012
comment
Думаю, я нашел проблему в коде. Вы используете кнопку переменной класса, а в ClickHandler он использует последний добавленный removeButton. Так что если вы просто измените первую строку кода в getRemove () на Button remove = new Button("");, все будет в порядке. - person Alexey A.; 12.07.2012
comment
если быть точным final Button remove = new Button(""); - person Alexey A.; 12.07.2012

Лучшее решение для динамического получения rowIndex в обработчике должен использовать flexTable.getCellForEvent(event):

remove.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        int rowIndex = flexTable.getCellForEvent(event).getRowIndex();
        flexTable.removeRow(rowIndex);
    }
});
person zigarn    schedule 03.08.2012