Posted by
Kenneth Sloan-2 on
Mar 18, 2020; 1:17pm
URL: http://imagej.273.s1.nabble.com/KeyListener-problem-tp5023044p5023050.html
This is a JAVA plugin. It's too big to post all of it - but here are what I think are the relevant parts. Again - it works perfectly on one machine - and fails intermittently on another.
Perhaps someone who has done this before can spot my error. I was following the template for keyListener on the imageJ site.
public class AVL_Area_Fraction implements PlugIn, KeyListener, ImageListener
{
...
private boolean waitingForKey = false;
private int keyCode;
private char keyChar;
private int modifiers;
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e)
{
IJ.log("keyPressed");
if(!waitingForKey) return; // ignore keyboard when we don't want a key
keyCode = e.getKeyCode();
keyChar = e.getKeyChar();
modifiers = e.getModifiers();
IJ.log(" "+keyCode+" "+keyChar+" "+modifiers);
waitingForKey = false;
}
@Override
public void imageClosed(ImagePlus imp)
{
IJ.log("imageClosed");
if(null!=win) win.removeKeyListener(this);
if(null!=canvas) canvas.removeKeyListener(this);
ImagePlus.removeImageListener(this);
IJ.log("removed Listeners");
}
@Override
public void imageOpened(ImagePlus imp){}
@Override
public void imageUpdated(ImagePlus imp){}
@Override
public void run(String arg0)
{
... other setup
// listen to keyboard - stop IJ from listening!
win.removeKeyListener(IJ.getInstance());
canvas.removeKeyListener(IJ.getInstance());
IJ.log("removed IJ Listeners");
win.addKeyListener(this);
canvas.addKeyListener(this);
ImagePlus.addImageListener(this);
IJ.log("added Listeners");
...
int category;
try
{
win.requestFocus();
IJ.log("sampling...");
category = sampleAt(...);
IJ.log("sampled");
}
catch (Exception e)
{
throw new RuntimeException(programName+" interrupted");
}
...
// done listening to the keyboard
win.removeKeyListener(this);
canvas.removeKeyListener(this);
ImagePlus.removeImageListener(this);
IJ.log("removed Listeners");
...
private int sampleAt(...)
throws InterruptedException
{
...
while(true)
{
waitingForKey = true;
while(waitingForKey) Thread.sleep(100);
// key pressed!
// keyCode, keyChar, and modifiers are current
if(keyCode == KeyEvent.VK_SPACE) return -1; // DELETE does not work
if(keyCode == KeyEvent.VK_ENTER) return -2; // no mas!
int category = keyCode - KeyEvent.VK_1; // 1-based keys; 0-based category
if(category < 0) continue; // try again!
if(category >= choices.length) continue; // try again!
return category; // good category!
}
}
}
Looking at this, I'm wondering if there might be a race condition between adding the Listeners and going into the busy wait for "waitingForKey" to become false. But...that doesn't look like an issue - so I'm just at a loss.
When this fails, the log window shows
============================
removed IJ Listeners
added Listeners
sampling...
============================
So, it's clearly (?) stuck in the wait loop, and keyPressed is never called.
If anyone is up for it, I'd be happy to send the entire plugin for testing.
Again - works perfectly on one machine and fails intermittently on another. Both mac laptops - the failing one is older than the one that works. I think the "client" is currently testing on a 3rd laptop to see if the problem is specific to that one machine.
--
Kenneth Sloan
[hidden email]
Vision is the art of seeing what is invisible to others.
--
ImageJ mailing list:
http://imagej.nih.gov/ij/list.html