6

私の Java スイング アプリケーションでは、JPopupMenu で無効な JMenuItem をクリックするとメニューが非表示になることに気付きましたが、何もクリックされていないかのように非表示にしたくありません。これを防ぐ方法はありますか?

----------------------------------->更新: コード サンプルを追加:

JMenuItem saveMenuItem = new JMenuItem();

saveMenuItem.setEnabled(false);

saveMenuItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        saveMenuItemActionPerformed();
    }
});
add(saveMenuItem);

private void saveMenuItemActionPerformed() {
    System.out.println( "Save clicked." );
}
4

7 に答える 7

0

このメソッドを試してみましたか:http: //download.oracle.com/javase/6/docs/api/javax/swing/JMenuItem.html#setArmed%28boolean%29

「メニュー項目を準備して選択できるようにする」。これは、falseに設定するとうまくいくと思います。

于 2011-03-10T10:35:13.753 に答える
0

防ぐ方法がわからない。ただし、Visible(false)を設定して、表示されないようにすることができます。また、ユーザーが無効化メニューをクリックしても、アクションは実行されません。

于 2011-03-07T19:35:07.937 に答える
0

This has been tested and works.

The Look & Feel decides how to handle the mouse events on disabled menu items. Anyway, you can intercept the undesired events by using a custom MenuItem. Simply use that code (copy/paste):

public class CustomMenuItem extends JMenuItem {

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

    public CustomMenuItem() {
        super();
    }

    protected void processMouseEvent(MouseEvent e) {
        if (isEnabled()) super.processMouseEvent(e);
    }
}

First, adapt the code to suit your needs (optional).
Finally, replace any JMenuItem with a CustomMenuItem.

That's it!

于 2011-04-17T11:24:37.267 に答える
0

JMenuItemを無効にするをクリックして非表示にする問題について、私が思いついた唯一の解決策は次のとおりです。


import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

public class PopupMenuDisableNoCloseTest extends JPanel implements ActionListener
{
    public static void main(String[] args)
    {
        PopupMenuDisableNoCloseTest p = new PopupMenuDisableNoCloseTest();
        p.setPreferredSize(new Dimension(200, 300));
        p.setBackground(Color.GREEN);
        JPanel contentPane = new JPanel();
        contentPane.add(p);
        final JFrame f = new JFrame();
        final JPopupMenu popup = new JPopupMenu();
        final JMenuItem menuItem1 = new JMenuItem("A popup menu item");
        menuItem1.addActionListener(p);
        menuItem1.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mousePressed(MouseEvent e)
            {
                System.out.println(" menuItem1 mousePressed e.getPoint()=" + e.getPoint());
            }

            @Override
            public void mouseReleased(MouseEvent e)
            {
                System.out.println(" menuItem1 mouseReleased e.getPoint()=" + e.getPoint());
                if(!menuItem1.isEnabled())
                    popup.setVisible(true);
            }
        });
        menuItem1.setEnabled(false);
        popup.add(menuItem1);
        JMenuItem menuItem2 = new JMenuItem("Another popup menu item");
        menuItem2.addActionListener(p);
        popup.add(menuItem2);
        MouseListener popupListener = new PopupListener(popup);
        f.addMouseListener(popupListener);
        f.setContentPane(contentPane);
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        JMenuItem source = (JMenuItem) (e.getSource());
        String s = "Action event detected. Event source: " + source.getText();
        System.out.println("s=" + s);
    }

    static class PopupListener extends MouseAdapter
    {
        JPopupMenu popup;
        PopupListener(JPopupMenu popupMenu)
        {
            popup = popupMenu;
        }

        @Override
        public void mousePressed(MouseEvent e)
        {
            maybeShowPopup(e);
        }

        @Override
        public void mouseReleased(MouseEvent e)
        {
            maybeShowPopup(e);
        }

        private void maybeShowPopup(MouseEvent e)
        {
            if(e.isPopupTrigger())
            {
                popup.show(e.getComponent(),
                        e.getX(), e.getY());
            }
        }
    }
}

基本的に、リリースが JMenuItem の境界内にあるときに非表示が発生するため、無効になっているかどうかを確認してから、ポップアップを再度表示します。この時点で、非表示になることがすでに決定されているためです。コンポーネントの外側を指し、前のものを消費する別の MouseEvent で super.mouseRelease を呼び出そうとしましたが、何の役にも立ちません。

とにかく、このソリューションは機能します。楽しんで、ボロ

于 2011-04-05T19:33:06.550 に答える
0

要するに、これを行うことはできますが、独自のマウス リスナーを作成する必要があります。これには、jdk ソース コードから多くのコピー アンド ペーストが必要になる場合があります。これはあまり良い考えではありません。ライセンスの制限についてはわかりません。それはあなたのコードに置きます。

私はこの方法から掘り始めます:

javax.swing.plaf.basic.BasicMenuItemUI.Handler#mouseReleased

メニュー処理メカニズムがポップアップを非表示にするエントリポイントのようです。私はもっ​​と詳しく見ていきます

javax.swing.plaf.basic.BasicPopupMenuUI.MouseGrabber#stateChanged

EDIT @Burhan Valikarimwalaによる回答の開発、このアプローチを試してください:無効になっているJMenuItemからすべてのアクションリスナーを削除し、それらをいくつかの静的一時構造( a としましょうMap<WeakReference<JMenuItem>, List<MouseListener>>)に保存します。この方法では、ポップアップが非表示になりません。メニュー項目を再度有効にしたら、すべてのリスナーを追加し直します。それをいくつかのutilメソッドにすると、シームレスになります。

于 2011-03-08T15:07:07.977 に答える