Java Swing How to - Get JScrollPane to move based on current item








Question

We would like to know how to get JScrollPane to move based on current item.

Answer

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//  w  w  w  .j a v a  2  s.  co m
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.Timer;

public class Main {
  Component activeComponent;
  Component[] buttons;
  int index = 0;

  public Main() {
    JPanel panel = new JPanel();
    BoxLayout boxLayout = new BoxLayout(panel, BoxLayout.PAGE_AXIS);
    panel.setLayout(boxLayout);
    for (int i = 0; i < 40; i++) {
      panel.add(new JButton("Button " + i));
    }
    buttons = panel.getComponents();
    activeComponent = buttons[index];
    final JScrollPane scroll = new JScrollPane(panel);

    Timer timer = new Timer(500, new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        ((JButton) activeComponent).setForeground(Color.BLACK);
        if (index >= buttons.length - 1) {
          index = 0;
        } else {
          index++;
        }
        activeComponent = buttons[index];
        ((JButton) activeComponent).setForeground(Color.red);
        setView(scroll, activeComponent);
        System.out.println(((JButton) activeComponent).getActionCommand());
      }
    });
    timer.start();

    scroll.setPreferredSize(new Dimension(200, 300));
    JFrame frame = new JFrame();
    frame.add(scroll);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public void setView(JScrollPane scroll, Component comp) {
    JViewport view = scroll.getViewport();
    Point p = comp.getLocation();
    view.setViewPosition(p);
  }

  public static void main(String[] args) {
    new Main();
  }
}