如何区分setValue和JScrollBar中的单击箭头按钮?

时间:2014-07-05 04:47:21

标签: java swing design-patterns jscrollbar

我使用简单的JScrollbar作为我的应用来控制JPanel中绘图的可见部分。每次移动视口时,我都使用滚动条的setValue方法,每次拖动滚动条时,我都会移动视口。

这是基本代码:

public void adjustmentValueChanged(AdjustmentEvent event) {
    JScrollBar scrollbar = ((JScrollBar) event.getSource());
       if (scrollbar.getValueIsAdjusting()) {
            _panel.moveViewport(scrollbar.getValue(), 0);
       }
}

当我以编程方式更改视口时,我使用方法moveViewport

 public void moveViewport(int x, int y) {
       /* change the viewport */
       _scrollbar.setValue(x)
 }

一切正常。我使用getValueIsAdjusting来区分值从setValue更改的时间以及旋钮的拖动。

我的问题是当我尝试使用unitIncrement按钮时。当我按下按钮时,该事件与我呼叫scrollbar.setValue时的事件相同。因此,如果我更改if(event.getValueIsAdjusting)以接受点击,它将接受setValue并开始递归。

这种情况下的设计模式是什么?是MouseListener for JScrollBar arrow buttons中扩展滚动条的唯一答案吗?

请不要告诉我使用JScrollPane。我不能将其用于其他原因。但我认为滚动窗格可以做的所有事情都可以通过JScrollBar进行。

编辑:我想我修好了......但我不明白怎么做!我使用删除了getIsValueIsAdjusting并使用了SwingUtilities.invokeLater(感谢this question),现在我可以按下按钮而不递归。所以我的新问题是“为什么会这样?”

0 个答案:

没有答案