JDK-4117048 : CheckBoxMenuItem: ItemStateChanged event not generated by call to setState()
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 1.1.5,1.3.0
  • Priority: P4
  • Status: Closed
  • Resolution: Not an Issue
  • OS: generic,solaris_2.6
  • CPU: generic
  • Submitted: 1998-03-04
  • Updated: 2001-11-29
  • Resolved: 2001-11-29
Related Reports
Relates :  
Description
If the state of a CheckboxmenuItem is changed programaticly, ie via a call to setState(), no ItemStateChanged event
is generated or broadcast to the listeners.

sample program CI.java:

/* CI.java -
**      tests programatic changes to state of a CheckboxMenuItem to see if a
**      registered listener is called.
*/

import java.awt.event.*;
import java.awt.*;

public class CI {
    public static void main(String [] args) {
        Point p;
        Frame frame = new Frame();
        frame.setBounds(100,100,500,500);
        CheckboxMenuItem  ci = new CheckboxMenuItem("text", false);
        Menu menu = new Menu("MyMenu");
        MenuBar mb = new MenuBar();
        mb.add(menu);
        menu.add(ci);

        frame.setMenuBar(mb);
        frame.setVisible(true);

        frame.addWindowListener ( new WindowAdapter() {
            public void windowClosing( WindowEvent e ) {
                System.exit(0);
            }
        });

        ci.addItemListener(new LLCI());
        System.out.println("changing CheckboxMenuItem state on and off");
        ci.setState(true);
        ci.setState(false);
    }
}

class LLCI implements ItemListener {
    public void itemStateChanged(ItemEvent e) {
        System.out.println("ItemStateChanged event: "+e);
    }
}

Comments
SUGGESTED FIX see fix in javasoft tree in : src/solaris/sun/sun/awt/motif/MCheckboxMenuItemPeer.java 1.13 diffs: < * @(#)MCheckboxMenuItemPeer.java 1.12 97/10/06 --- > * @(#)MCheckboxMenuItemPeer.java 1.13 98/03/04 25a26 > import java.awt.event.*; 27d27 < import java.awt.event.ItemEvent; 29c29,32 < class MCheckboxMenuItemPeer extends MMenuItemPeer implements CheckboxMenuItemPeer { --- > class MCheckboxMenuItemPeer extends MMenuItemPeer > implements CheckboxMenuItemPeer { > private boolean inUpCall=false; > private boolean inInit=false; 30a34,36 > native void pSetState(boolean t); > native boolean getState(); > 32a39 > inInit=true; 33a41 > inInit=false; 39c47 < MMenuPeer parent = (MMenuPeer) MToolkit.targetToPeer(target.getParent()); --- > MMenuPeer parent = (MMenuPeer)MToolkit.targetToPeer(target.getParent()); 47c55,60 < pSetState(t); --- > if (!inUpCall && (t != getState())) { > pSetState(t); > if (!inInit) { > notifyStateChanged(t); > } > } 49d61 < native void pSetState(boolean t); 51c63 < public void action(long when, int modifiers, boolean state) { --- > void notifyStateChanged(boolean state) { 53,56c65,75 < cb.setState(state); < postEvent(new ItemEvent(cb, ItemEvent.ITEM_STATE_CHANGED, < target.getLabel(), < state? ItemEvent.SELECTED : ItemEvent.DESELECTED)); --- > ItemEvent e = new ItemEvent(cb, > ItemEvent.ITEM_STATE_CHANGED, > cb.getLabel(), > state ? ItemEvent.SELECTED : ItemEvent.DESELECTED); > postEvent(e); > } > > public void action(long when, int modifiers, boolean state) { > inUpCall = true; > ((CheckboxMenuItem)target).setState(state); /* set value in target */ > notifyStateChanged(state); gdisun%
11-06-2004

EVALUATION Name: ksT78225 Date: 01/14/99 ======================================================================== R.Chandrasekar, SIPTech, ###@###.###, Jan 14, 1999 Thisbug exists on all platforms The bug exists when tested in the following jdk1.1.7 (K build ) under Windows NT, Windows 95 jdk1.2 fcs (I build) under Windows NT, Windows 95 jdk1.1.7 (K buid) in Solaris x86 jdk1.2 fcs (I build) in Solaris x86 jdk1.1.7 (K buid) in Solaris sparc jdk1.2 fcs (I build) in Solaris sparc ======================================================================== ====================================================================== 5/8/2000 kevin.ryan@eng -- reproducible with kestrel (1.3.0-C) under both win32 and Solaris. --- Not a bug. The CheckboxMenuItem.setState() docs state, "Note that this method should be primarily used to initialize the state of the check box menu item. Programmatically setting the state of the check box menu item will not trigger an ItemEvent. The only way to trigger an ItemEvent is by user interaction." I believe this change was made in Merlin. See bug 4318851. ###@###.### 2001-11-28
28-11-2001