I use a simple JScrollbar for my app for controlling the visible part of a drawing in a JPanel. Every time I move the view port I use the setValue method of the scroll-bar, and every time I drag the scroll-bar I move the view port. 
This is the basic code:
public void adjustmentValueChanged(AdjustmentEvent event) {
    JScrollBar scrollbar = ((JScrollBar) event.getSource());
       if (scrollbar.getValueIsAdjusting()) {
            _panel.moveViewport(scrollbar.getValue(), 0);
       }
}
And when I programmatically change the view port I use the method moveViewport
 public void moveViewport(int x, int y) {
       /* change the viewport */
       _scrollbar.setValue(x)
 }
All works fine. I use getValueIsAdjusting to differentiate when the value was changed from the setValue and the drag of the knob.
My problem is when I try to use the unitIncrement buttons. When I press a button, the event is the same as when I call scrollbar.setValue. So if I change the if (event.getValueIsAdjusting) to accept the click, it will accept the setValue and it starts a recursion.
What is the design pattern in this case? Is the only answer to extend scroll-bars as in MouseListener for JScrollBar arrow buttons?
Please, do not tell me to use JScrollPane. I can not use it for other reasons. But I think that everything a scroll pane can do I could do with a JScrollBar.
EDIT: I think I fixed it... but I do not understand how!!! I used removed the getIsValueIsAdjusting and used the SwingUtilities.invokeLater (thanks to this question) and now I can press the buttons without recursion. So my new question is "why it works?"