|
StackWindow |
|
package ij.gui;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import ij.*;
/** This class is an extended ImageWindow used to display image stacks. */
public class StackWindow extends ImageWindow implements Runnable, AdjustmentListener, ActionListener, MouseWheelListener {
protected Scrollbar sliceSelector;
protected Thread thread;
protected volatile boolean done;
protected volatile int slice;
public StackWindow(ImagePlus imp) {
this(imp, null);
}
public StackWindow(ImagePlus imp, ImageCanvas ic) {
super(imp, ic);
// add slice selection slider
ImageStack s = imp.getStack();
int stackSize = s.getSize();
addMouseWheelListener(this);
sliceSelector = new Scrollbar(Scrollbar.HORIZONTAL, 1, 1, 1, stackSize+1);
add(sliceSelector);
ImageJ ij = IJ.getInstance();
if (ij!=null) sliceSelector.addKeyListener(ij);
sliceSelector.addAdjustmentListener(this);
sliceSelector.setFocusable(false); // prevents scroll bar from blinking on Windows
int blockIncrement = stackSize/10;
if (blockIncrement<1) blockIncrement = 1;
sliceSelector.setUnitIncrement(1);
sliceSelector.setBlockIncrement(blockIncrement);
pack();
show();
int previousSlice = imp.getCurrentSlice();
imp.setSlice(1);
if (previousSlice>1 && previousSlice<=stackSize)
imp.setSlice(previousSlice);
thread = new Thread(this, "SliceSelector");
thread.start();
}
public synchronized void adjustmentValueChanged(AdjustmentEvent e) {
if (!running2){
slice = sliceSelector.getValue();
notify();
}
}
public void actionPerformed(ActionEvent e) {
}
public void mouseWheelMoved(MouseWheelEvent event) {
synchronized(this) {
int slice = imp.getCurrentSlice() + event.getWheelRotation();
if (slice<1)
slice = 1;
else if (slice>imp.getStack().getSize())
slice = imp.getStack().getSize();
imp.setSlice(slice);
}
}
public boolean close() {
if (!super.close())
return false;
synchronized(this) {
done = true;
notify();
}
return true;
}
/** Displays the specified slice and updates the stack scrollbar. */
public void showSlice(int index) {
if (index>=1 && index<=imp.getStackSize())
imp.setSlice(index);
}
/** Updates the stack scrollbar. */
public void updateSliceSelector() {
int stackSize = imp.getStackSize();
int max = sliceSelector.getMaximum();
if (max!=(stackSize+1))
sliceSelector.setMaximum(stackSize+1);
sliceSelector.setValue(imp.getCurrentSlice());
}
public void run() {
while (!done) {
synchronized(this) {
try {wait();}
catch(InterruptedException e) {}
}
if (done) return;
if (slice>0) {
int s = slice;
slice = 0;
if (s!=imp.getCurrentSlice())
imp.setSlice(s);
}
}
}
}
|
StackWindow |
|