Я уже слушаю MenuListener.menuSelected(), чтобы узнать, когда на экране отображается JMenu. Первоначально JMenu
имеет 1 JMenuItem, в котором говорится: «Загрузка ...». После медленной операции я добавляю JMenuItem
s к JMenu
. JMenu
продолжает показывать «Загрузка ...». Если я выберу еще JMenu
и вернусь, тогда JMenu покажет добавленные JMenuItem
s. Как я могу добавить добавленные JMenuItem
s для немедленного отображения?Добавить JMenuItem в уже видимый JMenu
Вот код, который воспроизводит то, что происходит.
public class AddMenuItem extends JFrame
{
private final JMenu m_menu = new JMenu("Edit");
public static void main(String args[])
{
new AddMenuItem().
setVisible(true);
}
public AddMenuItem()
{
JMenuBar bar;
bar = new JMenuBar();
bar.add(m_menu);
setJMenuBar(bar);
setSize(600, 400);
m_menu.addMenuListener(new MenuListener()
{
@Override
public void menuSelected(MenuEvent e)
{
JMenuItem loading;
loading = new JMenuItem("Loading...");
loading.setEnabled(false);
m_menu.removeAll();
m_menu.add(loading);
// This represents a long running task which updates the menu afterwards
new Timer(5 * 1000, event -> updateMenu()).start();
}
@Override
public void menuDeselected(MenuEvent e)
{
// nothing to do
}
@Override
public void menuCanceled(MenuEvent e)
{
// nothing to do
}
});
}
private void updateMenu()
{
m_menu.removeAll();
m_menu.add(new JMenuItem("1"));
m_menu.add(new JMenuItem("2"));
m_menu.add(new JMenuItem("3"));
m_menu.revalidate();
}
}
кажется, что это code example делает именно то, что я хочу, но я не уверен, что они делают, чтобы сделать видимым меню перекрашивать на экране.
решения @camickr «ы лучше, так как он не позволяет для любого мерцания всплывающего меню. – Nathan