0

定義済みのウィジェットを別のレイヤーにドラッグ/ドロップすることで、ユーザーが PDF ドキュメントをマークアップできるシンプルなアプリがあります。

私はJScollPaneを使用しています。ビューポートのサイズは、1 つの 8.5x11 ページに相当します。VScrollBar が最小位置にある場合、ページの上部が表示されます。最大位置では、下部が表示されます。この動作をオーバーライドしたいと思います。最小位置は最初のページの上部を表示し、最大位置は最後のページの下部を表示する必要があります。

私がぶつかった行き止まりの中で: JScrollPane に組み込まれている ScrollBar を置き換えます。VScrollBar によって発生した AdjustmentEvent をインターセプトします。そして、ScrollDemo の例を研究しています。これは簡単な機能のように思えますが、最初は行き詰っています。

助言がありますか?ありがとう!

4

2 に答える 2

1

最初のページの下半分と2番目のページの上半分を同時に表示できるようにしますか(要素をあるページから別のページにドラッグします)?または、一度に1つの完全なページだけですか?

まず、すべてのページを表示してJScrollPaneに追加する単一のコンポーネントが必要です。おそらく、ユニット/ブロックのスクロールを微調整するために、Scrollableインターフェイスを実装させたいと思うでしょう。

2つ目は、コンポーネントの横に1つの(垂直の)JScrollBarを表示し、その値に応じて表示されるページを変更するだけです。この場合、スライダーコントロールのようなスクロールバーを使用し、ページコンポーネントは実際にはスクロールできません(JScrollPaneは使用されません)。

于 2012-04-11T15:17:58.670 に答える
1

これはトリックを行うようです:

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 ) ;
    }
于 2012-04-12T04:07:21.203 に答える