Skip to content

Commit 261169d

Browse files
hansonrhansonr
authored andcommitted
JMenuBarUI fix
JMenuBar order of operations was required to be (1) adding menu items, (2) defining them. But the other order should be fine. Missing ContainerListener for JMenuBarUI
1 parent 691fe96 commit 261169d

File tree

9 files changed

+74
-15
lines changed

9 files changed

+74
-15
lines changed
-279 Bytes
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20181123173223
1+
20181124073539
-279 Bytes
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20181123173223
1+
20181124073539
-279 Bytes
Binary file not shown.

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSMenuBarUI.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@
3030

3131

3232
import java.awt.Dimension;
33+
import java.awt.event.ContainerEvent;
34+
import java.awt.event.ContainerListener;
35+
3336
import javax.swing.BoxLayout;
3437
import javax.swing.JComponent;
3538
import javax.swing.JMenuBar;
3639
import javax.swing.LookAndFeel;
3740
import javax.swing.plaf.UIResource;
41+
3842
import swingjs.api.js.DOMNode;
3943

4044
/**
@@ -45,7 +49,7 @@
4549
* @author Bob Hanson
4650
*
4751
*/
48-
public class JSMenuBarUI extends JSPanelUI {
52+
public class JSMenuBarUI extends JSPanelUI implements ContainerListener {
4953

5054
// static {
5155
//
@@ -109,6 +113,7 @@ public void installUI(JComponent jc) {
109113
if (menuBar.getLayout() == null ||
110114
menuBar.getLayout() instanceof UIResource) {
111115
menuBar.setLayout(new DefaultMenuLayout(menuBar,BoxLayout.LINE_AXIS));
116+
menuBar.addContainerListener(this);
112117
}
113118

114119
LookAndFeel.installColorsAndFont(jc,
@@ -141,5 +146,22 @@ public Dimension getPreferredSize() {
141146
Dimension d = new Dimension(0, 25);
142147
return d;
143148
}
149+
150+
@Override
151+
public void componentAdded(ContainerEvent e) {
152+
// OK, the idea here is that we detach all child nodes
153+
// and then reattach them.
154+
DOMNode.detachAll(outerNode);
155+
setTainted();
156+
setHTMLElement();
157+
}
158+
159+
@Override
160+
public void componentRemoved(ContainerEvent e) {
161+
DOMNode.detachAll(outerNode);
162+
setTainted();
163+
setHTMLElement();
164+
}
165+
144166

145167
}

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSMenuItemUI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void propertyChange(PropertyChangeEvent e) {
9393
if (jc.isVisible()) {
9494
if (prop == "ancestor") {
9595
if (jc.getParent() != null) {
96-
((JSComponentUI) jc.getParent().getUI()).setHTMLElement();
96+
((JSComponentUI) jc.getParent().getUI()).setHTMLElement();
9797
}
9898
}
9999
}

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSMenuUI.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.awt.Dimension;
55
import java.awt.event.ContainerEvent;
66
import java.awt.event.ContainerListener;
7+
import java.beans.PropertyChangeEvent;
78

89
import javax.swing.JComponent;
910
import javax.swing.JMenu;
@@ -20,7 +21,7 @@ public JSMenuUI() {
2021
@Override
2122
public DOMNode updateDOMNode() {
2223
if (domNode == null) {
23-
isMenuItem = !((JMenu) jc).isTopLevelMenu();
24+
isMenuItem = !jm.isTopLevelMenu();
2425
if (isMenuItem) {
2526
containerNode = domNode = createItem("_menu", null);
2627
} else {
@@ -54,15 +55,15 @@ public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
5455
}
5556
if (eventType == -1) {
5657
if (type.equals("mouseenter")) {
57-
if(!jc.getParent().getUIClassID().equals("MenuBarUI"))
58+
if(!jm.getParent().getUIClassID().equals("MenuBarUI"))
5859
stopPopupTimer();
59-
((JMenu) jc).setSelected(true);
60+
jm.setSelected(true);
6061
return true;
6162
}
6263
if (type.equals("mouseleave")) {
63-
((JMenu) jc).setSelected(false);
64+
jm.setSelected(false);
6465
System.out.println("menubar leaving");
65-
if(jc.getParent().getUIClassID().equals("MenuBarUI"))
66+
if(jm.getParent().getUIClassID().equals("MenuBarUI"))
6667
startPopupTimer();
6768
return true;
6869
}
@@ -71,13 +72,37 @@ public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
7172
return super.handleJSEvent(target, eventType, jQueryEvent);
7273
}
7374

75+
@Override
76+
public void propertyChange(PropertyChangeEvent e) {
77+
String prop = e.getPropertyName();
78+
if (jc.isVisible()) {
79+
if (prop == "ancestor") {
80+
if (jc.getParent() != null) {
81+
if (domNode != null && isMenuItem == jm.isTopLevelMenu()) {
82+
dispose();
83+
reInit();
84+
outerNode = null;
85+
updateDOMNode();
86+
return;
87+
}
88+
}
89+
}
90+
}
91+
super.propertyChange(e);
92+
}
7493

7594
@Override
7695
public void installUI(JComponent jc) {
7796
jm = (JMenu) jc;
7897
super.installUI(jc);
7998
}
8099

100+
@Override
101+
public void uninstallUI(JComponent jc) {
102+
super.uninstallUI(jc);
103+
}
104+
105+
81106
@Override
82107
protected Component[] getChildren() {
83108
return (isMenuItem ? new Component[] { jm.getPopupMenu() } : jm

sources/net.sf.j2s.java.core/src/test/JalviewJSTest.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,18 @@ void doTest()
5656
JFrame main = new JFrame();
5757
main.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
5858
JMenu menu = new JMenu("testing");
59+
60+
JMenu menu1 = new JMenu("testing1");
61+
JMenu menu2 = new JMenu("testing2");
62+
63+
64+
5965
menu.setHorizontalAlignment(SwingConstants.RIGHT);
60-
main.setContentPane(getVisualPaneContent(menu));
6166
main.setJMenuBar(new JMenuBar());
67+
main.setContentPane(getVisualPaneContent(menu, menu1, menu2));
6268
main.getJMenuBar().add(menu);
69+
main.getJMenuBar().add(menu1);
70+
main.getJMenuBar().add(menu2);
6371
main.pack();
6472
main.setVisible(true);
6573

@@ -73,7 +81,8 @@ void doTest()
7381
@Override
7482
public void mouseClicked(MouseEvent e) {
7583
System.out.println(pmenu.getComponents().length);
76-
pmenu.remove(pmenu.getComponents().length - 1);
84+
if (pmenu.getComponents().length > 1)
85+
pmenu.remove(pmenu.getComponents().length - 1);
7786
System.out.println(pmenu.getComponents().length);
7887
pmenu.show(main, 100, 100);
7988
System.out.println(pmenu.getComponents().length);
@@ -113,7 +122,7 @@ public void mouseExited(MouseEvent e) {
113122
* problems
114123
* @param menu
115124
*/
116-
Container getVisualPaneContent(JMenu menu)
125+
Container getVisualPaneContent(JMenu menu, JMenu menu1, JMenu menu2)
117126
{
118127
JPanel panel = new JPanel();
119128
panel.setPreferredSize(new Dimension(400, 500));
@@ -280,16 +289,19 @@ public void actionPerformed(ActionEvent e) {
280289
JMenu m2 = new JMenu("right");
281290
m2.setFont(font);
282291
m2.addMenuListener(this);
283-
m1.add(cb4m);
284-
m1.add(cb3m);
285-
m1.add(cb5m);
286292
m2.add(cb6m);
287293
m2.add(rb1m);
288294
m1.add(rb2m);
289295
m2.add(rb3m);
290296
m2.add(mb3);
291297
m2.add(mb4);
292298

299+
300+
menu1.add(cb4m);
301+
menu1.add(cb3m);
302+
menu2.add(cb5m);
303+
304+
293305

294306
mb4.addItemListener(this);
295307
menu.add(m1);

0 commit comments

Comments
 (0)