Hello Miguel
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6499857
I submitted a fix.
Sorry, I can't find the fix
How did you submit it ?
The fix works for JMenuItems, but when I look at the
documentation, I see that other components may also be added to JMenus,
and the fix won't work for them. But after experimenting, I discovered
that, if I add a JButton to a JMenu, the bug doesn't show up. So the bug
only affects JMenuItems that are added to a JMenu.
This raises an interesting question. Is there a better fix for this?
Right now, JMenuItems are added to menus through a special mechanism,
and other JComponents are added through the standard mechanism, but they
both work as menu items.
Do you mean JMenu.add(JMenuItem) comparing with JMenu.add(JComponent) ?
Their implementation looks almost identical
Furthermore, getRootPane() works for items
added through the standard mechanism. This raises an obvious question:
Would JMenuItems work fine if added through the standard mechanism? If
so, that would be a better fix, and here's why:
There are a few related bugs. For example, bug 4231737 (which has the
mysterious designation of RFE) is caused by
JOptionPane.getWindowForComponent(Component parentComponent), which
calls itself recursively like this:
return JOptionPane.getWindowForComponent(parentComponent.getParent())
(with other code to end this cycle cleanly.)
Looping on parent.getParent() is a common thing to do, and shows up in
these four methods in SwingUtilities:
Window getWindowAncestor(Component c)
Window windowForComponent(Component c)
Component getRoot(Component c)
JRootPane getRootPane(Component c)
I'm sure a few developers have also written this loop. And all of these
fail for JMenuItems for the same reason getRootPane() fails.
So I am currently investigating why getRootPane() works for a JButton
added to a menu, and I'm looking at how hard it will be to make
JMenuItems work through the standard mechanism instead of the custom
one. (I realize this is probably a long shot.) If that works, it would
be a better fix, because it would fix all four of the methods above, as
well as every individual developer's parent=parent.getParent() loop.
It would be really great to investigate all of that questions
Thanks
alexp
-- Miguel
*/Alexander Potochkin <[EMAIL PROTECTED]>/* wrote:
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.
>
>