package com.explodingpixels.widgets;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JComponent;
/**
* A {@link javax.swing.JComponent} that tracks the width or height of another component.
*/
public class TrackingSpacer extends JComponent {
private final JComponent fComponent;
private final TrackingDimension fTrackingDimension;
private final int fDelta;
/**
* Creates a spacer component that adjusts it's width or height to the
* given component.
*
* @param componentToTrack the component to track the width or height of.
* @param trackingDimension the dimension of the given compoonent to track.
* @param delta the amount to add or subtract from the given components
* size (helps accomodate padding).
*/
public TrackingSpacer(JComponent componentToTrack,
TrackingDimension trackingDimension,
int delta) {
fComponent = componentToTrack;
fTrackingDimension = trackingDimension;
fDelta = delta;
// listen for the given component to be resized.
fComponent.addComponentListener(createComponentListner());
// update the initial preferred size of the spacer.
doTrackedComponentResized();
}
private void doTrackedComponentResized() {
setPreferredSize(fTrackingDimension.createDimension(fComponent, fDelta));
revalidate();
}
private ComponentListener createComponentListner() {
return new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
doTrackedComponentResized();
}
};
}
/**
* An enumeration representing the dimension of a component to track.
*/
public enum TrackingDimension {
WIDTH {
// return a Dimension based on the given components width dimension.
Dimension createDimension(JComponent component, int delta) {
return new Dimension(component.getWidth() + delta, 1);
}},
HEIGHT {
// return a Dimension based on the given components height dimension.
Dimension createDimension(JComponent component, int delta) {
return new Dimension(1, component.getHeight() + delta);
}};
abstract Dimension createDimension(JComponent component, int delta);
}
}