# JPopupMenu Fonts

**URL:** <https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696>\
**Category:** Ignition\
**Tags:** ignition79\
**Created:** [October 1, 2019, 2:12pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696 "2019-10-01T14:12:14Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![koryk](https://avatars.discourse-cdn.com/v4/letter/k/cdc98d/32.png) [@koryk](https://forum.inductiveautomation.com/u/koryk)\
**Post date:** [October 1, 2019, 2:12pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/1 "2019-10-01T14:12:14Z")

</div>

Hi, I have an existing project that uses dynamic popup menu’s for users (system.gui.createPopupMenu()). This is working fine, however, we have recently gone to touch screens, and require font size modifications. If I collect the current font from the menu using .getFont() and manipulate it, then set it back in the PopupMenu using setFont(), it does not modify during runtime (or in designer). If I read back the new font size, it reads back correctly, but does not display it. I have modified my code below to show what I have tried.

Thank you.

names = []  
funcs = []  
publicFuncs = []  
publicNames = []

publicNames.append(“TITLE”)  
def load(event):  
pass  
publicFuncs.append(load)

names.append(“Public”)  
funcs.append([publicNames, publicFuncs])  
names.append(“USER 1”)  
funcs.append([publicNames, publicFuncs])

from java.awt import Font  
from javax.swing.plaf import FontUIResource

menu = system.gui.createPopupMenu(names, funcs)

#Menu Size Doesn’t seem to do anything. Tried 10 to 10000  
menu.setSize(1000,1000)  
originalFont = menu.getFont()  
newFont1 = originalFont.deriveFont(24.0)  
newFont2 = Font(‘Dialog’,0,36)  
newFont3 = Font(Font.MONOSPACED, Font.BOLD, 36)  
newFont4 = FontUIResource(‘Dialog’,0,36)  
menu.setFont(newFont4)  
readbackFont = menu.getFont()  
print “New Font is: %s” % readbackFont   
#Show event + X,Y Coordinates  
menu.show(event,0,28)

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [October 1, 2019, 2:39pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/2 "2019-10-01T14:39:51Z")

</div>

Try recursing through the menu to set the font on every item. Also, when posting code or other plain text, use a line with just a triple-backquote (these ```) above and below the pasted text. That displays indentation and code formatting so we can understand…

---

<div class="post-metadata">

**Author:** ![koryk](https://avatars.discourse-cdn.com/v4/letter/k/cdc98d/32.png) [@koryk](https://forum.inductiveautomation.com/u/koryk)\
**Post date:** [October 1, 2019, 3:28pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/3 "2019-10-01T15:28:26Z")

</div>

Thanks for the code tip 🙂

If I try to insert a recursive loop:

```auto
for item in menu:
	item.setFont(newFont4)

```

Java returns a error:  
JyPopupMenu’ object is not iterable

Here is the original code with the formats:

```auto
names = []
funcs = []
publicFuncs = []
publicNames = []

publicNames.append("TITLE")
def load(event):
	pass
publicFuncs.append(load)
	
names.append("Public")
funcs.append([publicNames, publicFuncs])
names.append("USER 1")
funcs.append([publicNames, publicFuncs])
	
from java.awt import Font
from javax.swing.plaf import FontUIResource
	
menu = system.gui.createPopupMenu(names, funcs)

#Menu Size Doesn't seem to do anything. Tried 10 to 10000
menu.setSize(1000,1000)
originalFont = menu.getFont()
newFont1 = originalFont.deriveFont(24.0)
newFont2 = Font('Dialog',0,36)
newFont3 = Font(Font.MONOSPACED, Font.BOLD, 36)
newFont4 = FontUIResource('Dialog',0,36)
menu.setFont(newFont4)
readbackFont = menu.getFont()
print "New Font is: %s" % readbackFont	
#Define event + X,Y Coordinates
menu.show(event,0,28)

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [October 1, 2019, 3:32pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/4 "2019-10-01T15:32:25Z")

</div>

Try iterating over `menu.subElements` ([https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/javax/swing/JPopupMenu.html#getSubElements()](https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/javax/swing/JPopupMenu.html#getSubElements())):

```auto
for item in menu.subElements:
	item.setFont(newFont4)

```

---

<div class="post-metadata">

**Author:** ![koryk](https://avatars.discourse-cdn.com/v4/letter/k/cdc98d/32.png) [@koryk](https://forum.inductiveautomation.com/u/koryk)\
**Post date:** [October 1, 2019, 4:08pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/5 "2019-10-01T16:08:43Z")

</div>

Thanks Paul! I guess I don’t understand the JPopupMenu as well as I thought I did.

I can try playing with the last issue, but I may as well go ahead and ask:

![image](https://us1.discourse-cdn.com/inductiveautomation/original/2X/f/f804af14af11dc46c57fa95665ef936c0aa333e2.png)

Any idea how to get the “TITLE” font to change? I tried a second sub-iteration on ‘item’, but alas, no go ☹

---

<div class="post-metadata">

**Author:** ![koryk](https://avatars.discourse-cdn.com/v4/letter/k/cdc98d/32.png) [@koryk](https://forum.inductiveautomation.com/u/koryk)\
**Post date:** [October 1, 2019, 4:22pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/6 "2019-10-01T16:22:55Z")

</div>

Got it, I used a format on the string setting the font size:

```auto
publicNames.append('<HTML><font size="7">TITLE</HTML>')

```

If there is another way, I’d be happy to find out…

Thanks again @paul-griffith for the help!

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [October 1, 2019, 4:40pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/7 "2019-10-01T16:40:31Z")

</div>

You’ll need to recurse into the submenu items - the constructed `JyPopupMenu` itself contains `JyMenuItems`, which each have their own `getSubMenus()` method, and so on. A simple recursive function should do it, unless your menu gets over 1024 elements deep 😄 Something like this, after the createPopupMenu call:

```auto
menu = system.gui.createPopupMenu(names, funcs)

def updateFont(menu, font):
	menu.setFont(font)
	for item in menu.subElements:
		updateFont(item, font)

updateFont(menu, font4)

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [October 2, 2019, 7:05pm UTC](https://forum.inductiveautomation.com/t/jpopupmenu-fonts/28696/8 "2019-10-02T19:05:23Z")

</div>

2 posts were split to a new topic: [Customizing Tag Browse Tree](https://forum.inductiveautomation.com/t/customizing-tag-browse-tree/28755)
