這似乎這樣的伎倆:
class DocumentScroller extends JScrollPane implements ChangeListener {
Component view ;
JPanel bookPanel, bookTop ;
ScrollingDocumentListener listener ;
Dimension pageSize ;
public DocumentScroller (Component view) {
this.view = view ;
}
public DocumentScroller (Component view,
int vsbPolicy, int hsbPolicy) {
super(vsbPolicy, hsbPolicy) ;
this.view = view ;
}
public void setViewportView (Component view) {
this.view = view ;
}
public void setPageCount (int pagect) {
if (view == null)
return ;
pageSize = view.getPreferredSize() ;
Dimension bookSize = new Dimension(pageSize) ;
bookSize.height *= pagect ;
bookPanel = new JPanel() ;
bookPanel.setLayout(new BorderLayout()) ;
bookPanel.setPreferredSize(bookSize) ;
bookPanel.add(bookTop = new JPanel(),
BorderLayout.NORTH) ;
bookPanel.add(view, BorderLayout.CENTER) ;
super.setViewportView(bookPanel) ;
getViewport().addChangeListener(this) ;
}
public void setUnitIncrement (int unitIncrement) {
getVerticalScrollBar().setUnitIncrement(unitIncrement) ;
}
public void setValue (int value) {
getVerticalScrollBar().setValue(value) ;
}
public void setScrollingDocumentListener (
ScrollingDocumentListener listener) {
this.listener = listener ;
}
public void stateChanged (ChangeEvent e) {
try {
if (e.getSource().getClass()
!= Class.forName(
"javax.swing.JViewport"))
return ;
}
catch (Exception ex) {
return ;
}
Rectangle rect = ((JViewport) e.getSource()
).getViewRect() ;
int offset = rect.y %pageSize.height ;
int pageTop = rect.y -offset ;
int pos = offset *rect.height /pageSize.height ;
bookTop.setPreferredSize(
new Dimension(0, pageTop +pos)) ;
bookPanel.doLayout() ;
if (listener != null)
listener.setPage(pageTop /pageSize.height) ;
}
}
interface ScrollingDocumentListener {
void setPage (int pageno) ;
}
請看看你是否可以澄清你的問題或張貼的代碼片段演示您的問題 – ControlAltDel 2012-04-11 15:10:53
我已經發布的示例代碼。我回答了這個問題,但事實上,仍然存在一個小問題。任何方式來重新將它指定爲「未答覆」? – 2012-04-14 21:49:59