Changeset 4015


Ignore:
Timestamp:
05/07/08 13:31:05 (12 years ago)
Author:
curtis
Message:

Some improvements to the image viewer:

  • Display "no image plane" message if the plane is null or out of bounds (such as when the -range option is used).
  • Press space bar to animate over time; set FPS using Options menu.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/gui/ImageViewer.java

    r3223 r4015  
    4747 * @author Curtis Rueden ctrueden at wisc.edu 
    4848 */ 
    49 public class ImageViewer extends JFrame 
    50   implements ActionListener, ChangeListener, MouseMotionListener 
     49public class ImageViewer extends JFrame implements ActionListener, 
     50  ChangeListener, KeyListener, MouseMotionListener, Runnable 
    5151{ 
    5252 
     
    5454 
    5555  protected static final String TITLE = "Bio-Formats Viewer"; 
    56   protected static final GraphicsConfiguration GC = 
    57     ImageTools.getDefaultConfiguration(); 
     56  protected static final char ANIMATION_KEY = ' '; 
    5857 
    5958  // -- Fields -- 
     
    7473  protected BufferedImage[] images; 
    7574  protected int sizeZ, sizeT, sizeC; 
     75 
     76  protected boolean anim = false; 
     77  protected int fps = 10; 
    7678 
    7779  // -- Constructor -- 
     
    190192    fileExit.addActionListener(this); 
    191193    file.add(fileExit); 
     194    JMenu options = new JMenu("Options"); 
     195    options.setMnemonic('o'); 
     196    menubar.add(options); 
     197    JMenuItem optionsFPS = new JMenuItem("Frames per Second..."); 
     198    optionsFPS.setMnemonic('f'); 
     199    optionsFPS.setActionCommand("fps"); 
     200    optionsFPS.addActionListener(this); 
     201    options.add(optionsFPS); 
    192202    JMenu help = new JMenu("Help"); 
    193203    help.setMnemonic('h'); 
     
    199209    help.add(helpAbout); 
    200210 
     211    // add key listener to focusable components 
     212    nSlider.addKeyListener(this); 
     213    zSlider.addKeyListener(this); 
     214    tSlider.addKeyListener(this); 
     215    cSlider.addKeyListener(this); 
     216 
    201217    // image I/O engine 
    202218    myReader = new ChannelMerger(new FileStitcher()); 
    203219    myWriter = new ImageWriter(); 
     220 
     221    // animation thread 
    204222  } 
    205223 
     
    351369  public int getC() { return cSlider.getValue() - 1; } 
    352370 
     371  // -- Window API methods -- 
     372  public void setVisible(boolean visible) { 
     373    super.setVisible(visible); 
     374    // kick off animation thread 
     375    new Thread(this).start(); 
     376  } 
     377 
    353378  // -- ActionListener API methods -- 
    354379 
     
    395420    } 
    396421    else if ("exit".equals(cmd)) dispose(); 
     422    else if ("fps".equals(cmd)) { 
     423      // HACK - JOptionPane prevents shutdown on dispose 
     424      setDefaultCloseOperation(EXIT_ON_CLOSE); 
     425 
     426      String result = JOptionPane.showInputDialog(this, 
     427        "Animate using space bar. How many frames per second?", "" + fps); 
     428      try { 
     429        fps = Integer.parseInt(result); 
     430      } 
     431      catch (NumberFormatException exc) { 
     432        if (FormatHandler.debug) LogTools.trace(exc); 
     433      } 
     434    } 
    397435    else if ("about".equals(cmd)) { 
    398436      // HACK - JOptionPane prevents shutdown on dispose 
     
    415453  public void stateChanged(ChangeEvent e) { 
    416454    Object src = e.getSource(); 
     455    boolean outOfBounds = false; 
    417456    if (src == nSlider) { 
    418457      // update Z, T and C sliders 
     
    440479      if (ndx >= 0) { 
    441480        nSlider.removeChangeListener(this); 
     481        outOfBounds = ndx >= nSlider.getMaximum(); 
    442482        nSlider.setValue(ndx + 1); 
    443483        nSlider.addChangeListener(this); 
     
    445485    } 
    446486    updateLabel(-1, -1); 
    447     BufferedImage image = getImage(); 
    448     if (image != null) icon.setImage(getImage()); 
    449     iconLabel.repaint(); 
    450   } 
     487    BufferedImage image = outOfBounds ? null : getImage(); 
     488    if (image == null) { 
     489      iconLabel.setIcon(null); 
     490      iconLabel.setText("No image plane"); 
     491    } 
     492    else { 
     493      icon.setImage(image); 
     494      iconLabel.setIcon(icon); 
     495      iconLabel.setText(null); 
     496    } 
     497  } 
     498 
     499  // -- KeyListener API methods -- 
     500 
     501  /** Handles key presses. */ 
     502  public void keyPressed(KeyEvent e) { 
     503    if (e.getKeyChar() == ANIMATION_KEY) anim = !anim; // toggle animation 
     504  } 
     505 
     506  public void keyReleased(KeyEvent e) { } 
     507  public void keyTyped(KeyEvent e) { } 
    451508 
    452509  // -- MouseMotionListener API methods -- 
     
    457514  /** Handles cursor probes. */ 
    458515  public void mouseMoved(MouseEvent e) { updateLabel(e.getX(), e.getY()); } 
     516 
     517  // -- Runnable API methods -- 
     518 
     519  /** Handles animation. */ 
     520  public void run() { 
     521    while (isVisible()) { 
     522      if (anim) { 
     523        int t = tSlider.getValue(); 
     524        t = t % tSlider.getMaximum() + 1; 
     525        tSlider.setValue(t); 
     526      } 
     527      try { 
     528        Thread.sleep(1000 / fps); 
     529      } 
     530      catch (InterruptedException exc) { 
     531        if (FormatHandler.debug) LogTools.trace(exc); 
     532      } 
     533    } 
     534  } 
    459535 
    460536  // -- Helper methods -- 
Note: See TracChangeset for help on using the changeset viewer.