There are many ways you could achieve this, but using a dynamic panel is likely the best. Your button wouldn’t even need a conditional case, just an action of “Set Panel State of MyiconPanel to Next, wrap”.
How many are “a lot of icons”? Dozens? Hundreds? Thousands? I’ve used a dynamic panel for same basic purpose–to present and review dozens of icons, in usability tests to get reactions to icon, graphic and layout variations. I’ve set up over 50 states, fairly easily and with good results, even in a repeater.
If you have many many dozens, or hundreds/thousands of icons, you could set up several or many dynamic panels to house logical groups of icons.
Another approach you could take would be to just create/load all your icons as separate image files, all stacked in front of each other. Select them all and assign a Selection Group so that only one can be selected at a time. Set them all to Opacity: 0% as the default style. Then assign a Selection Style of Opacity: 100%. To show an icon, set it to Selected, which would show it and automatically “hide” all other icons. But, if you have a single button to “show another icon” the conditional case logic would likely be unwieldy. This approach would work better (but again, likely not better than a dynamic panel) if you have a button per icon, or a droplist to select a specific icon.
You could also set up a unique page per icon and load just one at a time in an Inline Frame widget. With this approach, I’d recommend using sequential numbers for the page names so you could just increment the value of a global variable or text widget and load that page name for each button click. This might make it easier to add and remove icons ongoing.