Reputation: 484
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
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...
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
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