Java 重写JScrollPane行为
我有一个简单的应用程序,允许用户通过将预定义的小部件拖放到单独的层中来标记PDF文档 我使用的是JScollPane。视口大小相当于单个8.5x11页面。当VScrollBar位于最小位置时,显示页面顶部;在最大位置,底部显示。我想推翻这种行为。最小位置应显示第一页的顶部,最大位置应显示最后一页的底部 在我遇到的死胡同中:替换JScrollPane中内置的滚动条;拦截VScrollBar触发的调整事件;并研究了ScrollDemo示例。这似乎是一个直截了当的特性,但我还是停留在一开始Java 重写JScrollPane行为,java,swing,jscrollpane,Java,Swing,Jscrollpane,我有一个简单的应用程序,允许用户通过将预定义的小部件拖放到单独的层中来标记PDF文档 我使用的是JScollPane。视口大小相当于单个8.5x11页面。当VScrollBar位于最小位置时,显示页面顶部;在最大位置,底部显示。我想推翻这种行为。最小位置应显示第一页的顶部,最大位置应显示最后一页的底部 在我遇到的死胡同中:替换JScrollPane中内置的滚动条;拦截VScrollBar触发的调整事件;并研究了ScrollDemo示例。这似乎是一个直截了当的特性,但我还是停留在一开始 有什么建议
有什么建议吗?谢谢 是否希望能够同时显示第一页的下半部分和第二页的上半部分(并将元素从一页拖到另一页)?还是一次只完成一页 首先,您需要一个只显示所有页面并将其添加到JScrollPane的组件。您可能希望让它实现可滚动的界面来微调单元/块滚动
第二,您只需在组件旁边显示一个(垂直)JScrollBar,并根据其值更改显示的页面。在这种情况下,您使用的滚动条更像是一个滑块控件,而您的页面组件实际上不可滚动(没有使用JScrollPane)。这似乎起到了作用:
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 ) ;
}
请查看是否可以澄清您的问题或发布一段代码片段来演示您的问题我已经发布了示例代码。我标记了这个问题的答案,但事实上,还有一个小问题。有没有办法将其重新命名为“未回答的”?这两种方法都没有描述Adobe的PDF阅读器的行为。但第二个更接近:滚动条需要调整当前页面的视图,但一次显示的页面永远不会超过一个。这种代码的问题是令人讨厌的反弹效果。首先,屏幕在滚动条动作时刷新。然后在stateChanged()上,“视图”组件稍微向上移动,并刷新显示。解决方案是以某种方式拦截第一次刷新。