我使用简单的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
进行。