Success. Thanks to all who responded. Michael Schmid's fix worked.
He suggested two additions to my code: a) insert IJ.wait(200) before getting the window, b) adding win.toFront() (again, with an IJ.wait(200) before it. I changed the waits to IJ.wait(500) and added win.toFront as he suggested, and all is well. Now, I think I'll implement the new plugin using the same style - for consistent behavior by the users. -- Kenneth Sloan [email protected] Vision is the art of seeing what is invisible to others. > On Oct 22, 2024, at 09:18, Michael Schmid <[email protected]> wrote: > > Hi Kenneth, > > the following works for me (on a newly created ImagePlus named > 'displayFFTimp'): > > > //wait a bit after a previous WaitForUserDialog has come up > IJ.wait(200); > ImageWindow win = displayFFTimp.getWindow(); > win.toFront(); > > IJ.wait(200); > //probably not needed > displayFFTimp.getCanvas().addKeyListener(this); > > displayFFTimp.getCanvas().removeKeyListener(IJ.getInstance()); > > displayFFTimp.getWindow().addKeyListener(this); > > displayFFTimp.getWindow().removeKeyListener(IJ.getInstance()); > > > public void keyTyped(KeyEvent e) {...} > > > public void keyPressed(KeyEvent e) { > ...} > > public void keyReleased(KeyEvent e) {...} > > > > Michael > ________________________________________________________________ > On 22.10.24 14:41, Kenneth R Sloan wrote: >> Also note that there is no log output from keyPressed(), which on the >> surface points away from wait/notify as the problem. >> And… key presses appear to me to be handled by ImageJ. Right now I’m >> focusing on the removeListener() call. >> -Kenneth Sloan >> On Tue, Oct 22, 2024 at 08:36 Kenneth R Sloan <[email protected]> >> wrote: >>> Thanks - I’ll look into it. I’ve key point is that this plugin worked >>> perfectly in 2020, but fails now. >>> >>> It turns out that my collaborator now actually prefers checkboxes over key >>> presses, so I might put this problem on the shelf for awhile. >>> >>> >>> -Kenneth Sloan >>> >>> >>> On Tue, Oct 22, 2024 at 08:08 Michael Schmid <[email protected]> >>> wrote: >>> >>>> Hi Kenneth, >>>> >>>> as far as I can say, KeyListeners on ImageWindow and ImageCanvas work >>>> well, also in the current version of ImageJ. I have a plugin with >>>> essentially the same calls to removeKeyListener and addKeyListener in >>>> regular use. >>>> >>>> Of course, the KeyListener of an image only works if that image is in >>>> the foreground. It won't work if the ImageJ panel (or something else) >>>> has focus. >>>> >>>> My suspicion is that the problem is not related to the KeyListener but >>>> rather to the synchronization and/or wait-notify construct. >>>> >>>> What is the function that the KeyListener is supposed to trigger? >>>> If does not take significant computation time, I usually put that >>>> directly into the keyPressed method. The wait-notify construct is needed >>>> only if the operation can take longer than a fraction of a second. The >>>> keyPressed callback is executed in the EventQueue; if one puts long >>>> calculations there, the GUI becomes slow. >>>> >>>> Just to make sure, one trivial mistake that sometimes happens is that >>>> "this" refers to different Objects, e.g. because one has an inner class. >>>> >>>> >>>> Michael >>>> ________________________________________________________________ >>>> On 21.10.24 17:59, Kenneth Sloan wrote: >>>>> I’m reviving an ImageJ Java plugin from 2020. It uses a KeyListener. >>>>> The new build does not get any keypresses. I’ve looked at the current >>>> documentation, and can’t find a problem. The plugin is fairly large. I’ll >>>> try to make a minimal version - but would be happy to share it on my >>>> ImageJ Update Site (see below). >>>>> >>>>> Remember - this plugin worked fine in 2020, but now fails. >>>>> >>>>> Here is what I think is the relevant code: >>>>> >>>>> // listen to keyboard - stop IJ from listening! >>>>> win = ipl.getWindow(); // delayed until we are SURE it's visible >>>>> IJ.log("win = "+win); >>>>> canvas = win.getCanvas(); >>>>> IJ.log("canvas = "+canvas); >>>>> 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"); >>>>> >>>>> … >>>>> >>>>> win.requestFocus(); >>>>> IJ.log("sampling...”); >>>>> category = sampleAt(xList.get(currentSamplePoint), >>>>> >>>> yList.get(currentSamplePoint)); >>>>> IJ.log("sampled”); >>>>> >>>>> … >>>>> >>>>> while(true) >>>>> { >>>>> synchronized(this) >>>>> { >>>>> IJ.log("waiting..."); >>>>> wait(); // keyPressed wakes us >>>>> IJ.log("woken up!"); >>>>> } >>>>> >>>>> … >>>>> >>>>> // 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! >>>>> } >>>>> ... >>>>> @Override >>>>> public void keyPressed(KeyEvent e) >>>>> { >>>>> IJ.log("keyPressed"); >>>>> keyCode = e.getKeyCode(); >>>>> keyChar = e.getKeyChar(); >>>>> modifiers = e.getModifiers(); >>>>> IJ.log(" "+keyCode+" "+keyChar+" "+modifiers); >>>>> synchronized(this) >>>>> { >>>>> IJ.log("notifying"); >>>>> notify(); >>>>> IJ.log("notified"); >>>>> } >>>>> } >>>>> >>>>> And here is the IJ Log: >>>>> >>>>> win = 16385_175994_R_IR_OCT_20120429-09_8C3F4720.bmp >>>>> canvas = ij.gui.ImageCanvas[canvas1,5,44,384x496] >>>>> removed IJ Listeners >>>>> added Listeners >>>>> sampling... >>>>> sampleAt(90.05, 63.05) >>>>> waiting... >>>>> >>>>> It looks to me as if we “wait” and then never get a KeyPress event. >>>>> >>>>> When I press keys, I seem to get the usual ImageJ responses (does this >>>> mean that the IJ Listeners were NOT removed? >>>>> >>>>> >>>>> >>>>> Update site: CreativeComputation >>>>> Plugin name: AVL_Area_Fraction >>>>> >>>>> — >>>>> Kenneth Sloan >>>>> [email protected] >>>>> Vision is the art of seeing what is invisible to others. >>>>> >>>>> -- >>>>> ImageJ mailing list: http://imagej.nih.gov/ij/list.html >>>> >>>> -- >>>> ImageJ mailing list: http://imagej.nih.gov/ij/list.html >>>> >>> >> -- >> ImageJ mailing list: http://imagej.nih.gov/ij/list.html > > -- > ImageJ mailing list: http://imagej.nih.gov/ij/list.html -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html
