How to override events for extended widgets in gwt? - gwt

How would I override events e.g. OnmouseOver, OnMouseOut in extended widgets?
I am trying to extend the Anchor widget and want to set a certain stylename from my CSS.

In this case you could add handlers in you constructor via addMouseOverHandler and addMouseOutHandler and the handlers add/remove your stylenames.
Another option is to override the OnBrowserEvent(Event event) method on catch the mouse over and mouse out events.
However, mouse out events won't work perfect in all browsers. Sometimes the mouse out event is not triggered on the widget and you're style will stay on the widget. If you want to set style on a widget you could also add a yourstylename:hover in you're style sheet, such that you let the browser do the work of adding and removing the stylenames.

Related

Why is IconButton considered a Stateless widget in Flutter?

https://docs.flutter.dev/development/ui/interactive
A stateless widget never changes. Icon, IconButton, and Text are examples of stateless widgets. Stateless widgets subclass StatelessWidget.
https://api.flutter.dev/flutter/material/IconButton-class.html
An icon button is a picture printed on a Material widget that reacts to touches by filling with color (ink).
Icon buttons are commonly used in the AppBar.actions field, but they can be used in many other places as well.
If the onPressed callback is null, then the button will be disabled and will not react to touch.
When this button reacts to user touches, that means it is interactive? Then why does it fall under Stateless category?
The icon button is reactive, it reacts to touches. But can not change its state.
Stateless means the Widget can not recompose but it does can react to userevents like tapping. Look Textfield it has the ability to recompose it self whenever the text changed, So it means it is changing its UI state which is called a 'Stateful Widget'.
I hope you understood Cheers!

How to access Nattable ViewportLayer scrollbar?

I'd like to put a custom listener on the scrollbar of the viewport layer to trigger other code whenever the scrollbar is moved. I currently extended the HorizontalScrollBarHandler and overrode the handleEvent() method. The handler needs to take in the scrollbar from the ViewportLayer, but unfortunately it's private and has no getter method. Is there any other way that I can access the scrollbar to use with my custom handler?
NatTable is a Canvas which is a Scrollable. So actually you should not try to do deal with internals. It should be possible to call natTable.getVerticalBar() and natTable.getHorizontalBar() to register your listener.
Alternatively you could implement your own IScroller as explained here: http://blog.vogella.com/2015/01/26/nattable-with-custom-scrollbars/
But just for adding a listener it should be sufficient to use default SWT mechanisms.

Adding a ClickHandler to the background of a FlowPanel in GWT

I'm new to GWT, and my search queries didn't turn up what I'm looking for, but I'm afraid I'm not phrasing them correctly, so I apologize if this is a simple/duplicate question.
I'm currently trying to figure out how to add a ClickHandler to the area of a FlowPanel that is not occupied by a specific Widget. I know that I can simply add a ClickHandler by wrapping the entire FlowPanel inside a FocusPanel, but that then triggers when any of the widgets inside the flow panel are clicked on. The widgets are typically composite widgets with complicated structures themselves.
My ultimate goal here is to process a click when a user clicks in empty space, but allow the individual widgets to have their own unique click handlers if the user clicks on a specific widget.
Any suggestions?
Thanks!
You have two options.
(A) Add the same click handler to all of your widgets, and then inside onClick perform different actions based on which widget was the source of a click.
(B) Get the mouse position (from ClickEvent), and then iterate through child widgets to see if this mouse position falls inside one of them.

GWT DisclosurePanel with Arrow Icon and Widget Header?

I need to have a DisclosurePanel with a FlexTable widget as the header and include the arrow icon with animation.
When adding a Widget to a DisclosurePanel, the arrow icon is disabled/replaced by the widget.
I've decided I need to either create a new class that extends FlexTable and has a cell with the arrow icon & the appropriate click handler to animate the icon, or create a wrapper class for DisclosurePanel (as it is a final class). Do either of these seem like a viable solution?
I would create a more generic Composite widget called HeaderWidgetWithArrow that contains
The down arrow image
Any arbitrary widget (such as a FlexTable)
The way if you want to include the arrow for a disclosure panel and say, a HorizontalPanel, you could just re-use the HeaderWidgetWithArrow for that.
Either way, I would not recommend extending FlexTable or DisclosurePanel. You should favor composition over inheritance.

How do you get GWT 2.0 to accept clicks on two different Widgets added to a LayoutPanel?

Using GWT 2.0 I have an entry point that adds two Widgets to a LayoutPanel which in turn is added to the RootLayoutPanel. The Widgets both handle click events and have click events registered to them. The problem is that only the last widget added to the LayoutPanel can actually be clicked. Switch the order in which the widgets are added switches the widget that works. Add mroe widgets and still the only you can click is the last one added to the LayoutPanel.
Any idea why this is? Is there any reasoning behind the behaviour, or have I missunderstood what is happening under the covers? How do I gat all widgets in the LayoutPanel to accept events? Should I be using another panel class?
I'm not too bothered if the LayoutPanel prevents anything below it from being clicked, but want all Widgets added to it to be clickable.
Stupid Boy! (said in the voice of Captain Mainwaring)
There is no problem having two Widgets on a LayoutPanel accepting clicks. But if you adjust the Widgets' size by manipulating their elements' styles directly then the containing element created by the LayoutPanel will still cover the whole screen. In effect the last Widget added always covered everything else.
GWT school: D- Must try harder. Easily distracted...