Как предотвратить исчезновение JPopUpMenu при установке флажков в нем? - PullRequest
9 голосов
/ 21 сентября 2010

Я хочу использовать JCheckBoxMenuItem s в JPopupMenu. Это работает, но проблема в том, что всплывающее меню исчезает, когда флажок установлен или снят. Поэтому, если кто-то хочет проверить / снять флажок с нескольких элементов, всплывающее окно нужно запускать повторно, что раздражает.

Любопытно, что если в меню я использую просто простые элементы JCheckBox (вместо JCheckBoxMenuItem s), то поведение будет таким, каким оно должно быть: всплывающее окно остается там, и флажки можно ставить или снимать. После этого всплывающее окно можно закрыть, просто щелкнув за его пределами.

Как заставить всплывающее окно вести себя так, когда есть элементы JCheckBoxMenuItem с? Я бы предпочел использовать JCheckBoxMenuItem s из-за их внешнего вида.

Ответы [ 2 ]

12 голосов
/ 21 сентября 2010

Ну, нашел рабочий ответ от http://forums.sun.com/thread.jspa?threadID=5432911. По сути, создайте пользовательский интерфейс:

public class StayOpenCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI {

   @Override
   protected void doClick(MenuSelectionManager msm) {
      menuItem.doClick(0);
   }

   public static ComponentUI createUI(JComponent c) {
      return new StayOpenCheckBoxMenuItemUI();
   }
}

и установите его в JCheckBoxMenuItem:

myJCheckBoxMenuItem.setUI(new StayOpenCheckBoxMenuItemUI());

ДонНе знаю, является ли это наиболее элегантным из возможных решений, но работает отлично.

3 голосов
/ 08 апреля 2014

Я столкнулся с проблемой с хорошим ответом Joonas Pulakka, потому что "UIManager lookandFeel" был проигнорирован.

Я нашел хороший трюк ниже на http://tips4java.wordpress.com/2010/09/12/keeping-menus-open/

Точканемедленно открыть меню после его закрытия, оно невидимо и сохраняет внешний вид и поведение приложения.

public class StayOpenCBItem extends JCheckBoxMenuItem {

    private static MenuElement[] path;

    {
        getModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                if (getModel().isArmed() && isShowing()) {
                    path = MenuSelectionManager.defaultManager().getSelectedPath();
                }
            }
        });
    }

    public StayOpenCBItem(String text) {
        super(text);
    }

    @Override
    public void doClick(int pressTime) {
        super.doClick(pressTime);
        MenuSelectionManager.defaultManager().setSelectedPath(path);
    }
}
...