7

私は JMenu を JButton のように動作させようとしていましたが、いくつかの問題があり、ここの誰かが助けてくれることを願っています!

これでMenuListenerをJMenuアイテムに追加しましたが、ポップアップメニュー/フォーカスを残して、JMenuを適切に繰り返しクリックしてこの機能をトリガーできるようにすることはできません。誰かが私が何をしているのか教えてくれることを望んでいました違う。ありがとう。

public void menuSelected(MenuEvent e)
        {
            ... // do stuff here code
            JMenu source = (JMenu)e.getSource();
            source.setSelected(false);
            source.setPopupMenuVisible(false);

        }
4

5 に答える 5

1

私はこれが古いスレッドであることを知っていますが、私は解決策があるかもしれないと思います。私は自分のアプリの1つでこの問題に遭遇し、回避策を見つけました。JMenuの代わりにJMenuItemを使用してみてください。JMenuBarに接続すると、JMenuと同じL&Fになります。レイアウトマネージャーは(設定していない場合でも)独自のルールに基づいてこのコンポーネントのサイズを変更するため、必要なのは新しい「ボタン」のサイズを設定することだけです。

http://www.javaworld.com/javaworld/jw-09-2000/jw-0922-javatraps.html

それを行う方法は、そのリンクの下にあります(リンクをクリックするのが不快な場合は、「setsizeが機能しません」をグーグルで検索してください。結果のトップ10に表示されます)。サイズを適切に設定しないと、新しい「ボタン」がJMenuBarの残りのスペースを埋めてしまいます。

このコードを試してください:

menuItem.setMinimumSize(someMenu.getSize());
menuItem.setPreferredSize(someMenu.getSize());
menuItem.setMaximumSize(someMenu.getSize());
menuItem.setActionCommand("ActionText");

setActionCommand()メソッドはアクションコマンドを設定するため、新しい「ボタン」をクリックすると、これはアクションイベント引数によってアクション実行メソッドに渡されるアクションコマンドになり、簡単に識別できます。

public void actionPerformed(ActionEvent e) {
    System.out.println(e.getActionCommand());
}

お役に立てれば!

于 2010-09-16T11:25:29.563 に答える
0

わかりました、これをもう少し調査することにしました。以下はその結果であり、JButton のように動作するように見えますが、jmenubar の jmenu のように見えます。以下のコード。(actionListener を JMenu に追加するだけでは正しく機能しないことに注意してください。これが mouselistener の理由です。通常のボタンと同じように、menubutton に actionListener を追加し、menubutton にメニュー項目を追加しない限り (技術的には可能です) JMenuBar に JMenu として表示されますが、ボタンのように動作します。

import java.awt.Component;
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 java.lang.reflect.Method;
import java.util.EventListener;   
import javax.swing.ImageIcon;
import javax.swing.JMenu;

public class MenuButton extends JMenu {

private boolean startedIn = false;
private ActionListener action;

public MenuButton(String title) {
    super(title);
    removeListeners(this);
    this.addMouseListener(new MenuButtonListener());

}

public MenuButton(ImageIcon icon) {
    super();
    removeListeners(this);
    this.addMouseListener(new MenuButtonListener());
    this.setIcon(icon);
}

public void addActionListener(ActionListener a) {
    action = a;
}
    //we need to remove all the listeners already associated with a JMenu. If we do
//not do this, then it will not behave as expected because some mouseclicks are eaten 
//by these listeners. There is no easy way to do that, the following method is a 
//workaroundprovided in the java bug database. 
static private void removeListeners(Component comp) {
    Method[] methods = comp.getClass().getMethods();
    for (int i = 0; i < methods.length; i++) {
        Method method = methods[i];
        String name = method.getName();
        if (name.startsWith("remove") && name.endsWith("Listener")) {

            Class[] params = method.getParameterTypes();
            if (params.length == 1) {
                EventListener[] listeners = null;
                try {
                    listeners = comp.getListeners(params[0]);
                } catch (Exception e) {
                    // It is possible that someone could create a listener
                    // that doesn't extend from EventListener. If so, ignore
                    // it
                    System.out.println("Listener " + params[0]
                            + " does not extend EventListener");
                    continue;
                }
                for (int j = 0; j < listeners.length; j++) {
                    try {
                        method.invoke(comp, new Object[] { listeners[j] });
                        // System.out.println("removed Listener " + name +
                        // " for comp " + comp + "\n");
                    } catch (Exception e) {
                        System.out
                                .println("Cannot invoke removeListener method "
                                        + e);
                        // Continue on. The reason for removing all
                        // listeners is to
                        // make sure that we don't have a listener holding
                        // on to something
                        // which will keep it from being garbage collected.
                        // We want to
                        // continue freeing listeners to make sure we can
                        // free as much
                        // memory has possible
                    }
                }
            } else {
                // The only Listener method that I know of that has more
                // than
                // one argument is removePropertyChangeListener. If it is
                // something other than that, flag it and move on.
                if (!name.equals("removePropertyChangeListener"))
                    System.out.println("    Wrong number of Args " + name);
            }
        }
    }
}

public class MenuButtonListener extends MouseAdapter {

    boolean within = false;
    boolean pressed = false;


    public void mousePressed(MouseEvent e) {
        MenuButton.this.setSelected(true);
        pressed = true;
        //System.out.println("pressed");
    }

    public void mouseReleased(MouseEvent e) {
        //System.out.println("released");
        MenuButton.this.setSelected(false);
        if (action != null && within && pressed) {
            action.actionPerformed(new ActionEvent(this,
                    ActionEvent.ACTION_PERFORMED, null));
            MenuButton.this.setSelected(false);
        }
        pressed = false;
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        within = true;
    }

    @Override
    public void mouseExited(MouseEvent e) {
        within = false;
    }
}
}
于 2012-06-20T15:10:42.477 に答える