Hello Miguel
The problem is simple. The getRootPane() method calls
SwingUtilities.getRootPane(Component c). That method loops on a call to
getParent, like this:
for( ; c != null; c = c.getParent()) {
if (c instanceof JRootPane) {
return (JRootPane)c;
}
}
The trouble is that anything placed on a menu doesn't belong to the
standard hierarchy. JMenus use a JPopupMenu, and JPopupMenus don't have
a parent, they have an invoker.
An obvious fix would be to override getParent() in JPopupMenu to call
getInvoker() and return that. This doesn't work. The getInvoker() method
returns a Component, but getParent() returns a Container. I can work
around this, but it breaks the menu code.
The fix is to complicate the loop on c = c.getParent(), by checking for
JMenuItems and handling them differently. This slows the loop down, so I
don't want to do that in Swing Utilities, because there's no need for
the more complicated loop for most components. Instead, I plan to
override getRootPane() in JMenuItem.
This sounds like a good idea
This is complicated by the fact that not all JMenuItems are broken.
JMenus are subclasses of JMenuItem, and they have a valid parent (unless
they're a submenu). But that should be easy to work around.
I'll have some code in a day or two. I'll include a test program. Are
there any constraints I should know about for the test program?
We use jtreg harness for our regression tests
http://openjdk.java.net/jtreg/index.html
It might look a bit messy,
but actually it's quite simple to write a test with jtreg
In your case, I imagine, you'd check JMenuItem.getRootPane()
and throw RuntimeException if it is null just like with JUnit
Thanks
alexp
-- Miguel Muñoz
On Sep 20, 2007, at 6:55 AM, Alexander Potochkin wrote:
Hello Miguel
I plan to fix bug 6499857. There are a couple of approaches, but I
think I know the best way to fix it. Has anybody else looked at this?
Currently no one works on this fix
so you are welcome to start with it !
Thanks
alexp
-- Miguel Muñoz
___________________
There are 10 kinds of people: Those who know binary and those who don't.
___________________
There are 10 kinds of people: Those who know binary and those who don't.