10

JCheckBoxMenuItemでsを使用したいJPopupMenu。動作しますが、問題は、チェックボックスの項目をオンまたはオフにするとポップアップ メニューが消えることです。そのため、複数のアイテムをチェック/チェック解除したい場合、ポップアップを繰り返し起動する必要があり、イライラします。

JCheckBox不思議なことに、 (s の代わりに) メニューで単純なアイテムを使用するJCheckBoxMenuItemと、動作は本来あるべきものになります: ポップアップはそこにとどまり、チェックボックスはチェック/チェック解除できます。完了したら、ポップアップの外側をクリックするだけでポップアップを閉じることができます。

アイテムがあるときにポップアップをそのように動作させるにはどうすればよいJCheckBoxMenuItemですか? 見た目から sを使用することをお勧めしJCheckBoxMenuItemます。

4

3 に答える 3

12

さて、 http://forums.sun.com/thread.jspa? threadID=5432911から実用的な答えが見つかりました。基本的に、カスタムUIを作成します。

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());

これが最もエレガントな解決策であるかどうかはわかりませんが、完全に機能します。

于 2010-09-21T11:06:58.723 に答える
3

「UIManager lookandFeel」が無視されたため、素敵な Joonas Pulakka の回答で問題が発生しました。

私は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);
    }
}
于 2014-04-08T14:04:23.980 に答える