Page 1 of 1

วิธีการ Synchronize 2 ScrollPane

Posted: 01 Jun 2015, 06:56
by brid.surapol

Re: วิธีการ Synchronize 2 ScrollPane

Posted: 01 Jun 2015, 06:56
by brid.surapol

Code: Select all

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
  
public class ScrollPaneTest
{
    public ScrollPaneTest()
    {
        JScrollPane scrollPane1 = new JScrollPane(getPanel());
        JScrollPane scrollPane2 = new JScrollPane(getPanel());
   
        Synchronizer synchronizer = new Synchronizer(scrollPane1, scrollPane2);
        scrollPane1.getVerticalScrollBar().addAdjustmentListener(synchronizer);
        scrollPane1.getHorizontalScrollBar().addAdjustmentListener(synchronizer);
        scrollPane2.getVerticalScrollBar().addAdjustmentListener(synchronizer);
        scrollPane2.getHorizontalScrollBar().addAdjustmentListener(synchronizer);
   
        JPanel panel = new JPanel(new GridLayout(1,0));
        panel.add(scrollPane1);
        panel.add(scrollPane2);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(panel);
        f.setSize(500,300);
        f.setLocation(200,200);
        f.setVisible(true);
    }
  
    private JPanel getPanel()
    {
        JPanel panel = new JPanel()
        {
            GradientPaint gradient;
  
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D)g;
                if(gradient == null)
                    init();
                g2.setPaint(gradient);
                g2.fillRect(0, 0, getWidth(), getHeight());
            }
  
            private void init()
            {
                gradient = new GradientPaint(0, 0, Color.red,
                                     getWidth(), getHeight(), Color.blue);
            }
        };
        panel.setPreferredSize(new Dimension(400,400));
        return panel;
    }
  
    public static void main(String[] args)
    {
        new ScrollPaneTest();
    }
}
  
class Synchronizer implements AdjustmentListener
{
    JScrollBar v1, h1, v2, h2;
  
    public Synchronizer(JScrollPane sp1, JScrollPane sp2)
    {
        v1 = sp1.getVerticalScrollBar();
        h1 = sp1.getHorizontalScrollBar();
        v2 = sp2.getVerticalScrollBar();
        h2 = sp2.getHorizontalScrollBar();
    }
  
    public void adjustmentValueChanged(AdjustmentEvent e)
    {
        JScrollBar scrollBar = (JScrollBar)e.getSource();
        int value = scrollBar.getValue();
        JScrollBar target = null;
  
        if(scrollBar == v1)
            target = v2;
        if(scrollBar == h1)
            target = h2;
        if(scrollBar == v2)
            target = v1;
        if(scrollBar == h2)
            target = h1;
  
        target.setValue(value);
    }
}

Re: วิธีการ Synchronize 2 ScrollPane

Posted: 01 Jun 2015, 06:57
by brid.surapol

Code: Select all

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
  
class Testing extends JFrame
{
  public Testing()
  {
    JScrollPane sp1 = new JScrollPane(new ScrollPanel());
    JScrollBar sBar1 = sp1.getVerticalScrollBar();
    JScrollPane sp2 = new JScrollPane(new ScrollPanel());
    JScrollBar sBar2 = sp2.getVerticalScrollBar();
    sBar2.setModel(sBar1.getModel()); //<--------------synchronize
    getContentPane().setLayout(new GridLayout(1,2));
    getContentPane().add(sp1);
    getContentPane().add(sp2);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(400,300);
    setLocation(400,300);
  }
  public static void main(String[] args) {new Testing().setVisible(true);}
}
class ScrollPanel extends JPanel
{
  public ScrollPanel()
  {
    setLayout(new GridLayout(50,1));
    for(int x = 0; x < 50; x++) add(new JLabel(""+(x+1)));
  }
}