Yes - I have a comment about waiting for the image to display. Seems likely that timing may have changed.
I’ll add an explicit delay. -Kenneth Sloan On Tue, Oct 22, 2024 at 09:20 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
