আমি জাভা সুইংতে ডান ক্লিকের প্রসঙ্গ মেনুটি কীভাবে তৈরি করব?


110

আমি বর্তমানে ডান ক্লিক ক্লিক করে প্রসঙ্গ মেনু তৈরি করছি রাইট ক্লিকে একটি নতুন ইনস্ট্যান্ট JMenuকরে এবং এর অবস্থানটি মাউসের অবস্থানের সাথে সেট করে রেখেছি ... এর চেয়ে ভাল উপায় আর কি আছে?

উত্তর:


140

আপনি সম্ভবত setVisible(true)মেনুতে কল করছেন। এটি মেনুতে কিছু কদর্য বগী আচরণ করতে পারে।

show(Component, int x, int x)পদ্ধতি হ্যান্ডলগুলি জিনিষ আপনি ঘটতে, (মাউসওভার উপর জিনিষ হাইলাইট এবং পপআপ যখন প্রয়োজন ক্লোজিং) যেখানে ব্যবহার প্রয়োজন সব setVisible(true)ঠিক কোন অতিরিক্ত আচরণ যোগ ছাড়া মেনু দেখায়।

ডান ক্লিক করতে পপআপ মেনুতে কেবল একটি তৈরি করুন JPopupMenu

class PopUpDemo extends JPopupMenu {
    JMenuItem anItem;
    public PopUpDemo() {
        anItem = new JMenuItem("Click Me!");
        add(anItem);
    }
}

তারপরে, আপনাকে যা করতে হবে তা হ'ল MouseListenerমেনুগুলির জন্য পপআপ করতে চাইলে উপাদানগুলিতে একটি কাস্টম যুক্ত করতে হবে।

class PopClickListener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
        if (e.isPopupTrigger())
            doPop(e);
    }

    public void mouseReleased(MouseEvent e) {
        if (e.isPopupTrigger())
            doPop(e);
    }

    private void doPop(MouseEvent e) {
        PopUpDemo menu = new PopUpDemo();
        menu.show(e.getComponent(), e.getX(), e.getY());
    }
}

// Then on your component(s)
component.addMouseListener(new PopClickListener());

অবশ্যই, টিউটোরিয়ালের কিছুটা গভীরতর ব্যাখ্যা রয়েছে।

দ্রষ্টব্য: আপনি যদি লক্ষ্য করেন যে পপআপ মেনুটি ব্যবহারকারী যেখানে ক্লিক করেছে সেখান থেকে বেরিয়ে আসছে, এক্স এবং ওয়াই স্থানাঙ্কের জন্য e.getXOnScreen()এবং e.getYOnScreen()পদ্ধতিগুলি ব্যবহার করে চেষ্টা করুন ।


উপরের কোডটি ব্যবহার করার পরে, আমি এই ত্রুটিটি পেয়েছি যে "চিত্র টাইপের পদ্ধতিতে অ্যাডমাউসলিস্টনার (মাউসলিস্টনার) আর্গুমেন্টগুলির জন্য প্রযোজ্য নয় (পপ-ক্লিকলিস্টার)" শুভেচ্ছা, বিনয়

1
@ user1035905 আপনি কি নিশ্চিত যে PopClickListenerপ্রসারিত হয়েছে MouseAdapter?
jjnguy

কীওয়ার্ডের প্রসঙ্গ মেনু কী দিয়ে আপনি এটি কীভাবে কাজ করবেন?
ক্রিস্টোফার হামারস্ট্রিম

ক্লিওপেট্রার চেয়ে এই সমাধানটি কেবলমাত্র তখনই ভাল হয় যখন আপনার কিছু কাস্টম লজিক প্রয়োজন হয় (উদাহরণস্বরূপ বিভিন্ন পরিস্থিতিতে বিভিন্ন পপআপ মেনু); তবুও, আপনাকে কনটেক্সট মেনু কী সহ কীবোর্ড শ্রোতা যুক্ত করতে হবে

2
কি componentজন্য দাঁড়ানো?

117

এই প্রশ্নটি কিছুটা পুরানো - উত্তরগুলি যেমন রয়েছে (এবং পাশাপাশি টিউটোরিয়াল)

সুইংয়ে পপআপমেনু সেট করার জন্য বর্তমান এপিআই

myComponent.setComponentPopupMenu(myPopupMenu);

এইভাবে এটি মাউস এবং কীবোর্ড ট্রিগার উভয়ের জন্য স্বয়ংক্রিয়ভাবে প্রদর্শিত হবে (উত্তরটি এলএএফ-র উপর নির্ভর করে)। এছাড়াও, এটি একটি ধারক শিশুদের জুড়ে একই পপআপ পুনরায় ব্যবহার সমর্থন করে। এই বৈশিষ্ট্যটি সক্ষম করতে:

myChild.setInheritsPopupMenu(true);

2
@ ইউজার 681159 কোনও কিছুই জানে না - এবং এটির দরকার নেই, আইএমও, কেবল এপিআই ডকটি পড়ুন :-)
ক্লিওপাত্রা

2
আপনি এটি কীভাবে ব্যবহার করবেন JTableযাতে এটি নির্বাচিত সারি বা যে সারিটিতে ডান ক্লিক করে সেখানে পপ হয়? নাকি এই দৃশ্যে পুরানো পদ্ধতিটিই বেছে নেওয়া উচিত?
অ্যালেক্স বারডুজেল

1
@Burfee পারেন যে বা subclassing মাধ্যমে JTable উন্নতি করুন ওভাররাইড getPopupLocation (..) এবং পরে ব্যবহারের জন্য অবস্থান সঞ্চয়, একটি সাম্প্রতিক QA তে দেখতে যা সব SwingX সংগ্রহ উপাদান বাস্তবায়িত হয়
kleopatra

18

জাভা টিউটোরিয়ালগুলির মেনু নিবন্ধটি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে একটি পপআপ মেনু আনার বিষয়ে একটি বিভাগ রয়েছে যা ক্লাসটি কীভাবে ব্যবহার করবেন তা ব্যাখ্যা করে ।JPopupMenu

টিউটোরিয়ালের উদাহরণ কোডটি দেখায় যে কীভাবে MouseListenerএকটি পপ-আপ মেনু প্রদর্শন করা উচিত সেই উপাদানগুলিতে কীভাবে গুলি যুক্ত করতে হবে এবং সেই অনুসারে মেনুটি প্রদর্শন করা হবে।

(আপনি যে পদ্ধতিটি বর্ণনা করেছেন তা টিউটোরিয়ালটি কোনও উপাদানটিতে একটি পপ-আপ মেনু দেখানোর পদ্ধতিটি উপস্থাপনের সাথে মোটামুটি অনুরূপ))


8

নিম্নলিখিত কোডটি Windowsঅনুলিপি, কাটা, পেস্ট, সমস্ত নির্বাচন করুন, পূর্বাবস্থায় ফিরিয়ে আনুন এবং পুনরায় ফাংশনগুলির সাথে পরিচিত একটি ডিফল্ট প্রসঙ্গ মেনু প্রয়োগ করে। এটি এছাড়াও কাজ করে Linuxএবং Mac OS X:

import javax.swing.*;
import javax.swing.text.JTextComponent;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class DefaultContextMenu extends JPopupMenu
{
    private Clipboard clipboard;

    private UndoManager undoManager;

    private JMenuItem undo;
    private JMenuItem redo;
    private JMenuItem cut;
    private JMenuItem copy;
    private JMenuItem paste;
    private JMenuItem delete;
    private JMenuItem selectAll;

    private JTextComponent textComponent;

    public DefaultContextMenu()
    {
        undoManager = new UndoManager();
        clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

        addPopupMenuItems();
    }

    private void addPopupMenuItems()
    {
        undo = new JMenuItem("Undo");
        undo.setEnabled(false);
        undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        undo.addActionListener(event -> undoManager.undo());
        add(undo);

        redo = new JMenuItem("Redo");
        redo.setEnabled(false);
        redo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        redo.addActionListener(event -> undoManager.redo());
        add(redo);

        add(new JSeparator());

        cut = new JMenuItem("Cut");
        cut.setEnabled(false);
        cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        cut.addActionListener(event -> textComponent.cut());
        add(cut);

        copy = new JMenuItem("Copy");
        copy.setEnabled(false);
        copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        copy.addActionListener(event -> textComponent.copy());
        add(copy);

        paste = new JMenuItem("Paste");
        paste.setEnabled(false);
        paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        paste.addActionListener(event -> textComponent.paste());
        add(paste);

        delete = new JMenuItem("Delete");
        delete.setEnabled(false);
        delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        delete.addActionListener(event -> textComponent.replaceSelection(""));
        add(delete);

        add(new JSeparator());

        selectAll = new JMenuItem("Select All");
        selectAll.setEnabled(false);
        selectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        selectAll.addActionListener(event -> textComponent.selectAll());
        add(selectAll);
    }

    private void addTo(JTextComponent textComponent)
    {
        textComponent.addKeyListener(new KeyAdapter()
        {
            @Override
            public void keyPressed(KeyEvent pressedEvent)
            {
                if ((pressedEvent.getKeyCode() == KeyEvent.VK_Z)
                        && ((pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0))
                {
                    if (undoManager.canUndo())
                    {
                        undoManager.undo();
                    }
                }

                if ((pressedEvent.getKeyCode() == KeyEvent.VK_Y)
                        && ((pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0))
                {
                    if (undoManager.canRedo())
                    {
                        undoManager.redo();
                    }
                }
            }
        });

        textComponent.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mousePressed(MouseEvent releasedEvent)
            {
                handleContextMenu(releasedEvent);
            }

            @Override
            public void mouseReleased(MouseEvent releasedEvent)
            {
                handleContextMenu(releasedEvent);
            }
        });

        textComponent.getDocument().addUndoableEditListener(event -> undoManager.addEdit(event.getEdit()));
    }

    private void handleContextMenu(MouseEvent releasedEvent)
    {
        if (releasedEvent.getButton() == MouseEvent.BUTTON3)
        {
            processClick(releasedEvent);
        }
    }

    private void processClick(MouseEvent event)
    {
        textComponent = (JTextComponent) event.getSource();
        textComponent.requestFocus();

        boolean enableUndo = undoManager.canUndo();
        boolean enableRedo = undoManager.canRedo();
        boolean enableCut = false;
        boolean enableCopy = false;
        boolean enablePaste = false;
        boolean enableDelete = false;
        boolean enableSelectAll = false;

        String selectedText = textComponent.getSelectedText();
        String text = textComponent.getText();

        if (text != null)
        {
            if (text.length() > 0)
            {
                enableSelectAll = true;
            }
        }

        if (selectedText != null)
        {
            if (selectedText.length() > 0)
            {
                enableCut = true;
                enableCopy = true;
                enableDelete = true;
            }
        }

        if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor) && textComponent.isEnabled())
        {
            enablePaste = true;
        }

        undo.setEnabled(enableUndo);
        redo.setEnabled(enableRedo);
        cut.setEnabled(enableCut);
        copy.setEnabled(enableCopy);
        paste.setEnabled(enablePaste);
        delete.setEnabled(enableDelete);
        selectAll.setEnabled(enableSelectAll);

        // Shows the popup menu
        show(textComponent, event.getX(), event.getY());
    }

    public static void addDefaultContextMenu(JTextComponent component)
    {
        DefaultContextMenu defaultContextMenu = new DefaultContextMenu();
        defaultContextMenu.addTo(component);
    }
}

ব্যবহার:

JTextArea textArea = new JTextArea();
DefaultContextMenu.addDefaultContextMenu(textArea);

textAreaডান ক্লিক করার পরে এখন এর একটি প্রসঙ্গ মেনু থাকবে।


দুর্দান্ত সমাধান। একটি জিনিস: আপনি সমস্ত প্ল্যাটফর্মগুলিতে সঠিকভাবে কাজ করার releasedEvent.isPopupTrigger()পরিবর্তে / ব্যবহার করতে পারেন releasedEvent.getButton() == MouseEvent.BUTTON3
ফ্রেডেরিক লাইটেনবার্গার

কী-শ্রোতা মধ্যে আরও একটি বাগ: pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()উভয় এই পারেন হওয়া আবশ্যক Exবা না ExExসংস্করণ getMenuShortcutKeyMask()10+ জাভা যেহেতু শুধুমাত্র উপলব্ধ।
ফ্রেডেরিক লাইটেনবার্গার

1

@ বুলিউইলপ্লাজার পরামর্শ দেওয়া সেই পদ্ধতির জন্য আমি ব্যবহার সংশোধন করব। কারণটি হ'ল যখন আমি কেবল প্রসঙ্গে মেনুতে পাঠ্যআরিয়া যুক্ত করার চেষ্টা করি তখন তা দৃশ্যমান হয় না, এবং আমি যদি প্রসঙ্গমেনু এবং কিছু প্যানেলে উভয়কে যুক্ত করি তবে এটি উত্সাহ দেয়: আমি যদি ডিজাইন সম্পাদকটিতে স্যুইচ করার চেষ্টা করি তবে ভিন্ন পিতামাতার দ্বৈত সংস্থান।

TexetObjcet.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isRightMouseButton(e)){
                contextmenu.add(TexetObjcet);
                contextmenu.show(TexetObjcet, 0, 0);
            }
        }
    }); 

পাঠ্য অবজেক্টের জন্য মাউস শ্রোতাকে আপনার মতো পপআপ করা দরকার। এটি যখন করবে আপনি যখন আপনার পাঠ্যের অবজেক্টে ডান ক্লিক করবেন এটি তখন পপআপটি যুক্ত করবে এবং প্রদর্শন করবে। এইভাবে আপনি সেই ত্রুটির মুখোমুখি হন না। @ বুলিউইলপ্লাজা যে সমাধানটি করেছেন তা আপনার প্রোগ্রামে প্রয়োগ করার জন্য খুব ভাল, সমৃদ্ধ এবং দ্রুত, যাতে আপনার এটি কীভাবে পছন্দ হয় তা আমাদের দেখার চেষ্টা করা উচিত।


এছাড়াও ভুলে যাবেন না যে আপনার এখনও সেই প্রসঙ্গমেনু আমদানি করতে হবে এবং নতুন উদাহরণ তৈরি করতে হবে।
ćমিć ব্রানিসিলাভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.