SplitPaneScrolling

yidaki

Erfahrenes Mitglied
Ich hab ein SplitPane erstellt indem zwei JTextPanes drin sind. Die sind wiederrum in ein JScrollPane reingesteckt, damit der Text bei variierender Fenstergröße, bzw. großen Textmengen scrollbar ist. ich möchte allerdings, das wenn die eine scrollbar betätigt wird die andere das gleiche macht, sprich sich beide textfelder nach unten bzw. oben bewegen...

hier der code, den......
Code:
private JTextPane orgScroll = new JTextPane();
private JTextPane comScroll = new JTextPane();
private JScrollPane orgPane = new JScrollPane(orgScroll);
private JScrollPane comPane = new JScrollPane(comScroll);
private JSplitPane splitPane = new JSplitPane(JSplitPaneHORIZONTAL_SPLIT, orgPane, comPane);

merci
 
Das hat nichts mit der SplitPane zu tun, sondern Du musst die beiden ScrollPanes synchronisieren. Das heißt, wenn eine ScrollPane gescrollt wird, soll die andere entsprechend darauf reagieren und ihre Position ändern. Das kannst Du zum Beispiel mit einem Listener lösen. Dabei musst Du nur aufpassen, dass Du nicht in einen Deadlock gerätst.;)
 
wenn ich nen listener mitlaufen lasse, sagen wir mal den mouselistener und will dann die methode isPressed so nutzen das der anderr scrollBalken (comPane)
das gleiche tut wie der andere, was bracht comPane um mitzuscrollen bzw. bewegt zu werden?
 
Statt MouseListener würde ich eher den AdjustmentListener bevorzugen. Den kannst Du dann an die ScrollBars von Deiner ScrollPane anhängen.;)


EDIT:
So, ich habe hier ein kleines Beispielprogramm, das das anschaulich macht:
Code:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;

/**
 * This class demonstrates how to synchronize the adjustment value of the many 
 * <code>JScrollPane</code>s. 
 * 
 * @author Willy Michel
 */
public class SynchronizedPanesDemo extends JFrame {
    
    /**
     * Creates a new instance of <code>SynchronizedPanesDemo</code>.
     */
    public SynchronizedPanesDemo() {
        super("SynchronizedPanes Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        final JTextPane textPaneLeft = new JTextPane();
        fillTextPane(textPaneLeft, "Left TextPane");
        final JTextPane textPaneRight = new JTextPane();
        fillTextPane(textPaneRight, "Right TextPane");
        final JScrollPane scrollPaneLeft = new JScrollPane(textPaneLeft);
        final JScrollPane scrollPaneRight = new JScrollPane(textPaneRight);
        final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                scrollPaneLeft, scrollPaneRight);
        getContentPane().add(splitPane);
        
        final AdjustmentController controller = new AdjustmentController();
        controller.registerScrollPane(scrollPaneLeft);
        controller.registerScrollPane(scrollPaneRight);

        setSize(400, 300);
        centerFrame(this);
        setVisible(true);
        splitPane.setDividerLocation(0.5);
    }
    
    /**
     * Fills the given TextPane with some number of rows with the specified
     * <code>feed</code>.
     * 
     * @param pane A <code>JTextPane</code> to fill.
     * @param feed A string to set to the rows.
     */
    private static void fillTextPane(final JTextPane pane, final String feed) {
        final StringBuffer text = new StringBuffer();
        for (int i = 0; i < 50; i++) {
            text.append(feed);
            text.append("\n");
        }
        pane.setText(text.toString());
    }
    
    /**
     * Locate the given Frame on the center of the screen.
     * 
     * @param frame A <code>JFrame</code> to center.
     */
    private static void centerFrame(final JFrame frame) {
        final Dimension frameSize = frame.getSize();
        final Toolkit toolkit = Toolkit.getDefaultToolkit();
        final Dimension screenSize = toolkit.getScreenSize();
        frame.setLocation((screenSize.width - frameSize.width) / 2,
                (screenSize.height - frameSize.height) / 2);
    }
    
    /**
     * Starts the application.
     * 
     * @param args Programm arguments
     */
    public static void main(String[] args) {
        new SynchronizedPanesDemo();
    }
    
    
    /**
     * The <code>AdjustmentController</code> synchronizes the adjustment value 
     * of the ScrollBars of all registered <code>JScrollPane</code>s. 
     */
    private class AdjustmentController implements AdjustmentListener {
        private List horizontalBars;
        private List verticalBars;
        
        /**
         * Creates a new instance of <code>AdjustmentController</code>.
         */
        public AdjustmentController() {
            super();
            horizontalBars = new ArrayList();
            verticalBars = new ArrayList();
        }
        
        /**
         * Adds the both <code>JScrollBar</code>s of the given <code>scrollPane
         * </code> to the lists of horizontal and vertical bars. Adds this 
         * controller as an <code>AdjustmentListener</code> to the bars.
         * 
         * @param scrollPane a <code>JScrollPane</code> to register.
         */
        public final void registerScrollPane(final JScrollPane scrollPane) {
            JScrollBar scrollBar = scrollPane.getHorizontalScrollBar();
            scrollBar.addAdjustmentListener(this);
            horizontalBars.add(scrollBar);
            
            scrollBar = scrollPane.getVerticalScrollBar();
            scrollBar.addAdjustmentListener(this);
            verticalBars.add(scrollBar);
        }
        
        /* (non-Javadoc)
         * @see java.awt.event.AdjustmentListener#adjustmentValueChanged(
         * java.awt.event.AdjustmentEvent)
         */
        public final void adjustmentValueChanged(final AdjustmentEvent e) {
            final JScrollBar scrollBar = (JScrollBar) e.getAdjustable();
            if (verticalBars.contains(scrollBar)) {
                synchronizeScrollBars(verticalBars, e.getValue());
            } else if (horizontalBars.contains(scrollBar)) {
                synchronizeScrollBars(horizontalBars, e.getValue());
            }
        }
        
        /**
         * Sets the adjustment value of all ScrollBars in the specified list
         * to the given value.
         *  
         * @param bars A <code>List</code> of the <code>JScrollBar</code>s.
         * @param value The adjustment value to set.
         */
        private void synchronizeScrollBars(final List bars, final int value) {
            JScrollBar bar;
            for (int i = 0; i < bars.size(); i++) {
                bar = (JScrollBar) bars.get(i);
                bar.setValue(value);
            }
        }
    }
}
 
Zuletzt bearbeitet:
Zurück