Ramin
Ramin

Reputation: 484

Swing - remove all but last JMenuItem in JMenu

I'm trying to remove every JMenuItem but the last one from a JMenu when a button is clicked but although I got it to work on the first few clicks, it stops working after several consecutive tries.

    int count = ojmenu.getMenuComponentCount();
    for(int i = 0; i<count-1 ; i++)
    {
        ojmenu.remove(i);
    }

Upvotes: 0

Views: 643

Answers (2)

MadProgrammer
MadProgrammer

Reputation: 347332

Have you considered just removing all the menu items and re-adding the last one, for example...

int count = menu.getMenuComponentCount();
Component last = menu.getMenuComponent(count - 1);
menu.removeAll();
menu.add(last);

You should beware that a JMenu may contain other components, so the using remove(int) may not actually be removing a menu item, but another component...

Menus

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
import org.jdesktop.jxlayer.JXLayer;
import org.pbjar.jxlayer.demo.TransformUtils;
import org.pbjar.jxlayer.plaf.ext.transform.DefaultTransformModel;

public class MenuExample {

    public static void main(String[] args) {
        new MenuExample();
    }

    public MenuExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final JMenu menu = new JMenu("Test");

                JButton build = new JButton("Build");
                build.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        makeItSo(menu);
                    }
                });
                JButton remove = new JButton("Remove");
                remove.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        int count = menu.getMenuComponentCount();
                        Component last = menu.getMenuComponent(count - 1);
                        menu.removeAll();
                        menu.add(last);
                    }
                });

                makeItSo(menu);

                JPanel buttons = new JPanel();
                buttons.add(build);
                buttons.add(remove);

                JMenuBar mb = new JMenuBar();
                mb.add(menu);

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setJMenuBar(mb);
                frame.add(buttons, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected void makeItSo(JMenu menu) {
        for (int index = 0; index < (Math.random() * 20); index++) {
            menu.add("MenuItem " + index);
        }
    }
}

Upvotes: 1

splungebob
splungebob

Reputation: 5435

Try looping backwards (starting at the next-to-last item) instead of forwards:

int count = ojmenu.getMenuComponentCount();
for (int i = count - 2; i >= 0; i--)
{
    ojmenu.remove(i);
}

Upvotes: 0

Related Questions