سؤال

كنت في محاولة لجعل نحن تتصرف مثل JButton ولكن أواجه بعض المشاكل و نأمل شخص ما هنا يمكن أن تساعد!

لقد أضاف MenuListener إلى نحن البند مع هذا ولكن أنا غير قادر على الحصول على القائمة المنبثقة/التركيز على ترك لتمكين لي بشكل صحيح انقر فوق نحن تتكرر مرات أن تؤدي هذه الوظيفة و كنت آمل شخص يمكن أن يقول لي ما أفعله خطأ.شكرا

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

        }
هل كانت مفيدة؟

المحلول

غير متأكد تماما ما أنت تسأل...

ولكن JMenuBar يرث من Container - إذا كنت تفضل إضافة JButton لأنها من JMenu يمكنكم ببساطة الاتصال

JMenuBar menuBar = ....
JButton myButton = ....
menuBar.add(myButton);

نصائح أخرى

ويعمل هذا نموذج التعليمات البرمجية في الكسوف، المعنية مرة أخرى عن الكيفية التي تستخدم بها؟

public class MyMenuFrame extends JFrame {


    public MyMenuFrame() throws HeadlessException {
        super("My Frame");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 300);
        Container pane = this.getContentPane();
        pane.setLayout(new BorderLayout());
        pane.add(new JLabel("Hi there"), BorderLayout.PAGE_START);
        this.setVisible(true);
        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("File");

        menu.addMenuListener(new MenuListener() {

            @Override
            public void menuSelected(MenuEvent e) {
                System.out.println("a");

            }

            @Override
            public void menuDeselected(MenuEvent e) {
                System.out.println("a");

            }

            @Override
            public void menuCanceled(MenuEvent e) {
                System.out.println("a");

            }
        });
        menubar.add(menu);
        this.setJMenuBar(menubar );
    }

    public static void main(String[] args) {
        new MyMenuFrame();
    }
}

وأنا أعلم هذا هو موضوع قديم، ولكن أعتقد أنني قد يكون لديك الحل. أنا تعثرت عبر هذا مشكلة في واحدة من التطبيقات الخاصة بي، وجدت الحل. حاول استخدام JMenuItem بدلا من JMenu. وسوف يكون لها نفس L & F باعتباره JMenu عند إرفاقه JMenuBar. يتم تعيين الشيء الوحيد الذي عليك القيام به حجم الخاصة بك "زر" الجديد، منصب مدير التخطيط الخاص بك (حتى إذا لم تكن مجموعة واحدة) وتغيير حجم هذا المكون على أساس القواعد الخاصة:

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

ووسيلة لتحقيق ذلك وجدت تحت هذا الرابط (إذا كنت تشعر بعدم الارتياح النقر على الرابط، وجوجل ل "setsize لا يعمل" - أنها ستكون في نتائج العشرة الأوائل). إذا لم تقم بتعيين حجم بشكل صحيح، سيكون لديك "الزر" جديد تملأ المساحة المتبقية من 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());
}

وآمل أن يساعد هذا!

من الصعب جدا تحديد ما كنت تحاول القيام به هنا.ولكن لا أعتقد أن كنت بشكل صحيح باستخدام نحن.

أ نحن هو الكائن الذي يمثل القائمة.بل هو منفصل من شريط القوائم (JMenuBar) ثم من القائمة البند (JMenuItem).أ JMenuBar عادة يحتوي على عدة JMenus (ملف, تحرير, الخ) والتي بدورها تحتوي على عدة JMenuItems (جديد, فتح, إغلاق).على JMenuItems ما هو النقر "يتصرف مثل زر" في القائمة.

للحصول على قائمة البند إلى قانون مثل زر ببساطة إضافته إلى القائمة.على سبيل المثال:

JMenu fileMenu = new JMenu("File");
JMenuItem newChoice = new JMenuItem("New");
newChoice.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        newHasBeenSelected();
    }
});
fileMenu.add(newChoice);

إذا كنت تحاول إنشاء القائمة المنبثقة ، تحتاج إلى استخدام JPopupMenu بدلا من نحن ، أنت لا تحتاج إلى JMenuBar.هنا دروس جافا على القوائم: http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html

وهنا جافا مستندات JMenuBar, نحن, JPopupMenu, ، JMenuItem.

إذا قمت بتحرير سؤالك وإعطاء شرح أكثر تفصيلا من ما تفعله أنا قد تكون قادرة على إعطاء المزيد من المساعدة الخاصة.

طيب أنا قررت أن التحقيق في هذا أكثر قليلا وفيما يلي reslut ويبدو أن تتصرف تماما مثل JButton ولكن يبدو وكأنه jmenu على jmenubar. الرمز أدناه. (ملاحظة فقط إضافة إلى actionListener إلى حق لم يعمل JMenu الذي هو السبب في mouselistener. يمكنك إضافة actionListener إلى menubutton تماما مثل زر العادي، وطالما أنت لا تضيف أي menuitems إلى menubutton (والتي من الناحية الفنية هل يمكن) سوف تبدو وكأنها JMenu على JMenuBar ولكنها تتصرف مثل زر واحدة.

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;
    }
}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top