Skip to content

Commit de97e2e

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 261169d commit de97e2e

File tree

11 files changed

+412
-423
lines changed

11 files changed

+412
-423
lines changed
441 Bytes
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20181124073539
1+
20181124101315
441 Bytes
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20181124073539
1+
20181124101315
441 Bytes
Binary file not shown.

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

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package swingjs.plaf;
22

33
import java.awt.AWTEvent;
4-
import javax.swing.SwingConstants;
54
import java.awt.Color;
65
import java.awt.Component;
76
import java.awt.Container;
@@ -35,8 +34,9 @@
3534
import javax.swing.Icon;
3635
import javax.swing.ImageIcon;
3736
import javax.swing.JComponent;
37+
import javax.swing.JMenu;
3838
import javax.swing.JPopupMenu;
39-
import javax.swing.SwingConstants.*;
39+
import javax.swing.SwingConstants;
4040
import javax.swing.UIManager;
4141
import javax.swing.event.ChangeEvent;
4242
import javax.swing.event.ChangeListener;
@@ -2489,4 +2489,47 @@ public void invalidate() {
24892489
setTainted();
24902490
}
24912491

2492+
/**
2493+
* mouseenter for a menuItem
2494+
* @param target
2495+
* @param eventType
2496+
* @param jQueryEvent
2497+
*/
2498+
protected void checkStopPopupMenuTimer(Object target, int eventType, Object jQueryEvent) {
2499+
if (target == domNode && eventType == -1) {
2500+
String type = (/** @j2sNative jQueryEvent.type || */"");
2501+
if (type.equals("mouseenter")) {
2502+
stopPopupMenuTimer();
2503+
}
2504+
}
2505+
}
2506+
2507+
protected int timer;
2508+
2509+
/**
2510+
* Called from JSMenuUI in a JMenuBar to start a timer that closes the popup window after a short period.
2511+
*
2512+
* @param ui
2513+
*/
2514+
protected void startPopupMenuTimer() {
2515+
JSPopupMenuUI ui = (JSPopupMenuUI) ((JMenu) jc).getPopupMenu().getUI();
2516+
ui.timer = /** @j2sNative setTimeout(function() { ui.hideMenu$()},1000) || */0;
2517+
}
2518+
2519+
/**
2520+
* Called from JSMenuUI, JSMenuItem, and JSRadioButtonUI to stop the the popup window timer so that it can persist.
2521+
*
2522+
* @param ui
2523+
*/
2524+
protected void stopPopupMenuTimer() {
2525+
JSPopupMenuUI ui = (JSPopupMenuUI) (isPopupMenu ? this : jc.getParent().getUI());
2526+
if (ui.timer != 0) {
2527+
/** @j2sNative
2528+
*
2529+
* clearTimeout(ui.timer);
2530+
*/
2531+
ui.timer = 0;
2532+
}
2533+
}
2534+
24922535
}

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

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package swingjs.plaf;
22

33

4-
import java.awt.Container;
54
import java.awt.Dimension;
65
import java.beans.PropertyChangeEvent;
76

87
import javax.swing.JComponent;
9-
import javax.swing.JMenu;
108
import javax.swing.JMenuItem;
119
import javax.swing.LookAndFeel;
12-
import javax.swing.plaf.ComponentUI;
1310

1411
import swingjs.api.js.DOMNode;
1512

@@ -35,39 +32,14 @@ public DOMNode updateDOMNode() {
3532
setupButton();
3633
return domNode;
3734
}
38-
35+
3936
@Override
4037
public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
41-
String type = "";
4238
// we use == here because this will be JavaScript
43-
if (target == domNode) {
44-
/**
45-
* @j2sNative
46-
*
47-
* type = jQueryEvent.type;
48-
*
49-
*/
50-
{
51-
}
52-
if (eventType == -1) {
53-
if (type.equals("mouseenter")) {
54-
stopPopupTimer();
55-
}
56-
}
57-
}
39+
checkStopPopupMenuTimer(target, eventType, jQueryEvent);
5840
return super.handleJSEvent(target, eventType, jQueryEvent);
5941
}
6042

61-
protected void startPopupTimer() {
62-
JSPopupMenuUI ui = (JSPopupMenuUI) ((JMenu) jc).getPopupMenu().getUI();
63-
((JSPopupMenuUI) ui).startTimer();
64-
}
65-
66-
protected void stopPopupTimer() {
67-
JSComponentUI ui = (JSComponentUI) ((JComponent) jc.getParent()).getUI();
68-
((JSPopupMenuUI) ui).stopTimer();
69-
}
70-
7143
@Override
7244
protected int getContainerHeight() {
7345
return height = 25;

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

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
import java.awt.Component;
44
import java.awt.Dimension;
5-
import java.awt.event.ContainerEvent;
6-
import java.awt.event.ContainerListener;
75
import java.beans.PropertyChangeEvent;
86

97
import javax.swing.JComponent;
108
import javax.swing.JMenu;
9+
1110
import swingjs.api.js.DOMNode;
1211
public class JSMenuUI extends JSMenuItemUI {
1312

@@ -25,13 +24,7 @@ public DOMNode updateDOMNode() {
2524
if (isMenuItem) {
2625
containerNode = domNode = createItem("_menu", null);
2726
} else {
28-
// DOMNode labelNode = newDOMObject("label", id);
2927
domNode = createItem("_item", null);
30-
//
31-
// // TODO implement icons for menuBar?
32-
// setCssFont(DOMNode.setAttr(labelNode, "innerHTML", menuItem.getText()),
33-
// c.getFont());
34-
// setDataComponent(labelNode);
3528
}
3629
DOMNode.addJqueryHandledEvent(this, domNode, "mouseenter mouseleave");
3730
}
@@ -42,31 +35,20 @@ public DOMNode updateDOMNode() {
4235

4336
@Override
4437
public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
45-
String type = "";
4638
// we use == here because this will be JavaScript
47-
if (target == domNode) {
48-
/**
49-
* @j2sNative
50-
*
51-
* type = jQueryEvent.type;
52-
*
53-
*/
54-
{
39+
if (target == domNode && eventType == -1) {
40+
String type = (/** @j2sNative jQueryEvent.type || */ "");
41+
if (type.equals("mouseenter")) {
42+
if (!jm.getParent().getUIClassID().equals("MenuBarUI"))
43+
stopPopupMenuTimer();
44+
jm.setSelected(true);
45+
return true;
5546
}
56-
if (eventType == -1) {
57-
if (type.equals("mouseenter")) {
58-
if(!jm.getParent().getUIClassID().equals("MenuBarUI"))
59-
stopPopupTimer();
60-
jm.setSelected(true);
61-
return true;
62-
}
63-
if (type.equals("mouseleave")) {
64-
jm.setSelected(false);
65-
System.out.println("menubar leaving");
66-
if(jm.getParent().getUIClassID().equals("MenuBarUI"))
67-
startPopupTimer();
68-
return true;
69-
}
47+
if (type.equals("mouseleave")) {
48+
jm.setSelected(false);
49+
if (jm.getParent().getUIClassID().equals("MenuBarUI"))
50+
startPopupMenuTimer();
51+
return true;
7052
}
7153
}
7254
return super.handleJSEvent(target, eventType, jQueryEvent);
@@ -79,7 +61,6 @@ public void propertyChange(PropertyChangeEvent e) {
7961
if (prop == "ancestor") {
8062
if (jc.getParent() != null) {
8163
if (domNode != null && isMenuItem == jm.isTopLevelMenu()) {
82-
dispose();
8364
reInit();
8465
outerNode = null;
8566
updateDOMNode();

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

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22

33

44
import java.awt.Dimension;
5-
import java.awt.event.ComponentEvent;
6-
import java.awt.event.ComponentListener;
75
import java.awt.event.ContainerEvent;
86
import java.awt.event.ContainerListener;
97

108
import javax.swing.JComponent;
119
import javax.swing.JPopupMenu;
1210
import javax.swing.LookAndFeel;
11+
1312
import swingjs.JSUtil;
13+
import swingjs.api.js.DOMNode;
1414
import swingjs.api.js.JSSwingMenu;
1515
import swingjs.jquery.JQueryUI;
16-
import swingjs.api.js.DOMNode;
1716

1817
public class JSPopupMenuUI extends JSPanelUI implements ContainerListener {
1918

2019

2120
static {
21+
@SuppressWarnings("unused")
2222
Object jqueryui = JQueryUI.class; // loads jQuery.ui
2323
}
2424

@@ -43,10 +43,7 @@ public void componentRemoved(ContainerEvent e) {
4343
setHTMLElement();
4444
}
4545

46-
/*private*/ int timer;
47-
4846
public JSPopupMenuUI() {
49-
5047
if (j2sSwingMenu == null) {
5148
JSUtil.loadStaticResource("swingjs/jquery/j2sMenu.js");
5249
j2sSwingMenu = J2S.getSwing();
@@ -65,10 +62,18 @@ public DOMNode updateDOMNode() {
6562
// isTopLevel = (!(popupMenu.getInvoker() instanceof JMenu)
6663
// || ((JMenu) popupMenu.getInvoker()).isTopLevelMenu());
6764
domNode = containerNode = newDOMObject("ul", id);
65+
DOMNode.addJqueryHandledEvent(this, domNode, "mouseenter");
6866
}
6967
return domNode;
7068
}
7169

70+
@Override
71+
public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
72+
// we use == here because this will be JavaScript
73+
checkStopPopupMenuTimer(target, eventType, jQueryEvent);
74+
return super.handleJSEvent(target, eventType, jQueryEvent);
75+
}
76+
7277
@Override
7378
public void installUI(JComponent jc) {
7479
((JPopupMenu) jc).addContainerListener(this);
@@ -125,25 +130,7 @@ public void setVisible(boolean b) {
125130
}
126131
}
127132

128-
void startTimer() {
129-
System.out.println("startTimer");
130-
Object me = this;
131-
timer = /** @j2sNative setTimeout(function() { me.hideMenu$()},1000) || */0;
132-
}
133-
134-
void stopTimer() {
135-
System.out.println("stopTimer");
136-
/** @j2sNative
137-
*
138-
* if (this.timer)
139-
* clearTimeout(this.timer);
140-
*/
141-
timer = 0;
142-
}
143-
144-
void hideMenu() {
145-
System.out.println("hideMenu");
146-
// not private -- hideMenu$
133+
/*not private*/ void hideMenu() {
147134
if (menu != null)
148135
j2sSwingMenu.hideMenu(menu);
149136
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ protected void createButton() {
4545
setEnabled(c.isEnabled());
4646
if (isMenuItem) {
4747
domNode = createItem("_item", buttonNode);
48+
DOMNode.addJqueryHandledEvent(this, domNode, "mouseenter");
4849
} else {
4950
domNode = newDOMObject("div", id + "_dom");
5051
// centeringNode = newDOMObject("div", id + "_ctr");
@@ -56,6 +57,15 @@ protected void createButton() {
5657
centeringNode.appendChild(iconNode);
5758
}
5859
}
60+
61+
@Override
62+
public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
63+
// we use == here because this will be JavaScript
64+
checkStopPopupMenuTimer(target, eventType, jQueryEvent);
65+
return super.handleJSEvent(target, eventType, jQueryEvent);
66+
}
67+
68+
5969

6070
/**
6171
*

0 commit comments

Comments
 (0)