How to get row of table that is double clicked

403 views
Skip to first unread message

jel...@gmail.com

unread,
Sep 19, 2006, 9:10:31 PM9/19/06
to Google Web Toolkit
Hi,

I've got a table that I can highlight the row when it is clicked.
However, I'd like to determine which row is double-clicked, so I can
get the data from that row to use elsewhere. I thought that using
onBrowserEvent would be the thing to use, but I haven't been able to
find any examples of using it to determine the row of a table. Does
anyone have an example of this?

Thanks,

jelentz

hoosie

unread,
Sep 19, 2006, 10:38:26 PM9/19/06
to Google Web Toolkit
You need to override the onBrowser event and sink the events you want.
Here's how I did it, although I wrote my own interface which included
an onDblClick event...

public void main() {
....
addTableListener(this);
sinkEvents(Event.ONCLICK | Event.ONDBLCLICK | Event.ONKEYDOWN);
....
}

public void onBrowserEvent(Event event) {
// Find out which cell was actually clicked.
Element td = getEventTargetCell(event);
if (td == null) {
return;
}
Element tr = DOM.getParent(td);
Element body = DOM.getParent(tr);
int row = DOM.getChildIndex(body, tr);
int column = DOM.getChildIndex(tr, td);
switch (DOM.eventGetType(event)) {
case Event.ONCLICK: {
if (this.tableListeners != null) {
// Fire the event.
tableListeners.fireCellClicked(this, row, column);
}
break;

}
case Event.ONDBLCLICK: {
if (this.tableListeners != null) {
// Fire the event.
tableListeners.fireCellDblClicked(this, row, column);
}
break;
}
default: {
// Do nothing
}

}
}

jel...@gmail.com

unread,
Sep 20, 2006, 7:20:28 AM9/20/06
to Google Web Toolkit
Thanks. I'll give it a try. Does anyone know of a good place to get a
tutorial on all the non-Java things that are used to make GWT useful?
For example, how/why to sink events or not, or when and how to use DOM
level operations? Thanks again.

jelentz

Message has been deleted

hoosie

unread,
Sep 20, 2006, 10:38:18 AM9/20/06
to Google Web Toolkit
I don't have any such guide, but I can answer your second question.

Each event has a set of browser events that fires it. For example take

a look at the source of the HTMLTable Class in the gwt-user jar. It
has the following constructor:


public HTMLTable() {
tableElem = DOM.createTable();
bodyElem = DOM.createTBody();
DOM.appendChild(tableElem, bodyElem);
setElement(tableElem);
sinkEvents(Event.ONCLICK);
}


Basically, it is "sinking" only the ONCLICK event, and will ignore all
other events. To 'sink' and event just means to react to any firings
of that event. A full list of the various events are listed here:


http://code.google.com/webtoolkit/documentation/com.google.gwt.user.c...

So, for example, if you wanted the table to respond to ONDBLCLICK
events, all you need to do is extend the class of the table you want to

use (let's say FlexTable), so you would make the class:


public class HappyTable extends FlexTable {
public HappyTable(){
super();
addTableListener(this);
sinkEvents(Event.ONCLICK | Event.ONDBLCLICK |
Event.ONKEYDOWN);
}
...

}


What this code is doing, is telling the table to react to click, double

click, and key press events. In the same code you would create an
onBrowser event method which would define what you want to do:

public void onBrowserEvent(Event event) {
// Find out which cell was actually clicked.
Element td = getEventTargetCell(event);
if (td == null) {
return;
}
Element tr = DOM.getParent(td);
Element body = DOM.getParent(tr);
int row = DOM.getChildIndex(body, tr);
int column = DOM.getChildIndex(tr, td);
switch (DOM.eventGetType(event)) {
case Event.ONCLICK: {
if (this.tableListeners != null) {
// Fire the event.
tableListeners.fireCellClicked(this,
row, column);
}
break;


}
case Event.ONDBLCLICK: {
if (this.tableListeners != null) {
// Fire the event.
tableListeners.fireCellDblClicked(this,
row, column);
}
break;
}

case Event.ONKEYDOWN: {
if (DOM.eventGetKeyCode(event) == KEY_UP) {
// Fire the event.
tableListeners.fireUpKey(this);
}
else if (DOM.eventGetKeyCode(event) ==
KEY_DOWN) {
// Fire the event.
tableListeners.fireDownKey(this);


}
break;
}
default: {
// Do nothing
}


}
}


Because I was doing a variety of things with the table I created my own

listener interface, and listener collection which included double
clicks, but this is not necessary for simpler things. Here it is
anyway (note that this implements all of clicks, dblclicks, and up/down

keys):


public interface HappyTableListener extends TableListener{


public void onCellDblClicked(SourcesTableEvents sender, int
row, int
cell);
public void onUpKey(SourcesTableEvents sender);
public void onDownKey(SourcesTableEvents sender);

}


public class MyTableListenerCollection extends Vector {

public void fireCellClicked(SourcesTableEvents sender, int row,
int
cell) {
for (Iterator it = iterator(); it.hasNext();) {
MyTableListener listener = (MyTableListener)
it.next();
listener.onCellClicked(sender, row, cell);
}
}


public void fireCellDblClicked(SourcesTableEvents sender, int
row, int
cell) {
for (Iterator it = iterator(); it.hasNext();) {
MyTableListener listener = (MyTableListener)
it.next();
listener.onCellDblClicked(sender, row, cell);
}
}


public void fireUpKey(SourcesTableEvents sender) {
for (Iterator it = iterator(); it.hasNext();) {
MyTableListener listener = (MyTableListener)
it.next();
listener.onUpKey(sender);
}
}
public void fireDownKey(SourcesTableEvents sender) {
for (Iterator it = iterator(); it.hasNext();) {
MyTableListener listener = (MyTableListener)
it.next();
listener.onDownKey(sender);
}
}

jel...@gmail.com

unread,
Sep 20, 2006, 9:27:31 PM9/20/06
to Google Web Toolkit
Thanks alot for the tutorial. It makes sense. I just need to read
more of the detailed docs. Thanks again.

jelentz

Leo

unread,
Oct 11, 2006, 10:57:08 AM10/11/06
to Google Web Toolkit

I'm also trying to process double clicks on a FlexTable, however when I
double click on my FlexTable I always get an Event.ONCLICK, not a
Event.ONDBLCLICK.

Here is my code:

public class MyFlexTable extends FlexTable
{
public MyFlexTable()
{
super();
sinkEvents(Event.ONCLICK | Event.ONDBLCLICK);
}

public void onBrowserEvent(Event event)
{
ISA.debug("--> onBrowserEvent() - event type: " +
DOM.eventGetType(event));
if (DOM.eventGetType(event) == Event.ONDBLCLICK)
{
ISA.debug("double click clicked.");
}
else
super.onBrowserEvent(event);
ISA.debug("<-- onBrowserEvent()");
}
}

The debug statements always show:

--> onBrowserEvent() - event type: 1
<-- onBrowserEvent()

Any help would be greatly appreciated.

Thanks,

Leo

Luciano Broussal

unread,
Oct 11, 2006, 11:01:43 AM10/11/06
to Google Web Toolkit
Hi,

Use inconjuction sinkEvent() and onBrowserEvent(Event event) to
control the event you want to manage for a widget.

Warning : this only work on widget , you can't not redefine it for a
composite :!!

Luciano

Leo

unread,
Oct 11, 2006, 1:04:44 PM10/11/06
to Google Web Toolkit
I don't understand what you are saying. I'm not having a problem
controling the event, I'm not getting the event.

Thanks,

Leo

Reply all
Reply to author
Forward
0 new messages