programing

Java Swing에서 오른쪽 클릭 컨텍스트메뉴를 작성하려면 어떻게 해야 하나요?

copysource 2022. 12. 10. 14:28
반응형

Java Swing에서 오른쪽 클릭 컨텍스트메뉴를 작성하려면 어떻게 해야 하나요?

현재 새 항목을 인스턴스화하여 마우스 오른쪽 버튼 컨텍스트 메뉴를 만들고 있습니다.JMenu마우스 오른쪽 버튼을 클릭하여 마우스 위치로 위치를 설정합니다.더 좋은 방법이 있을까요?

아마 수동으로 전화하고 있을 겁니다.setVisible(true)메뉴에 있습니다.그러면 메뉴에 고약한 버그가 발생할 수 있습니다.

show(Component, int x, int x)method는 필요한 모든 작업을 처리합니다(마우스 위에 강조 표시 및 필요에 따라 팝업 닫기).setVisible(true)는 추가 동작을 추가하지 않고 메뉴만 표시합니다.

오른쪽 클릭 팝업메뉴를 작성하려면 를 작성하기만 하면 됩니다.

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

그런 다음 메뉴를 팝업할 구성요소에 사용자 정의만 추가하면 됩니다.

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()x 및 y 좌표에 대한 메서드.

이 질문은 조금 오래된 질문입니다.답변(튜토리얼도 마찬가지)

Swing에서 popupMenu를 설정하기 위한 현재 api는

myComponent.setComponentPopupMenu(myPopupMenu);

이렇게 하면 마우스 트리거와 키보드 트리거 모두에 대해 자동으로 표시됩니다(후자는 LAF에 따라 다름).또한 컨테이너의 하위 항목에서 동일한 팝업을 재사용할 수 있습니다.이 기능을 유효하게 하려면 , 다음의 순서에 따릅니다.

myChild.setInheritsPopupMenu(true);

Java 튜토리얼의 메뉴 사용 방법 문서에 클래스 사용 방법을 설명하는 팝업 메뉴 표시 섹션이 있습니다.

튜토리얼의 예제 코드는 다음을 추가하는 방법을 보여 줍니다.MouseListener팝업 메뉴를 표시하는 컴포넌트로 이동하여 메뉴를 표시합니다.

(설명하는 방법은 튜토리얼이 컴포넌트에 팝업메뉴를 표시하는 방법과 매우 유사합니다).

다음 코드는 에서 알려진 기본 컨텍스트 메뉴를 구현합니다.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오른쪽 버튼을 켜면 컨텍스트메뉴가 표시됩니다.

@BullyWillPlaza가 제안한 방법을 수정하겠습니다.그 이유는 contextMenu에만 textArea를 추가하려고 하면 표시되지 않고 contextMenu와 일부 패널에 모두 추가하려고 하면 "디자인 에디터로 전환하려고 하면 다른 부모 더블 어소시에이션"이 표시되기 때문입니다.

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

팝업이 필요한 텍스트 개체에 대해 마우스 수신기를 이렇게 만드십시오.이렇게 하면 텍스트 개체를 마우스 오른쪽 버튼으로 클릭하면 해당 팝업이 추가되어 표시됩니다.이렇게 하면 오류가 발생하지 않습니다.@BullyWillPlaza가 만든 솔루션은 매우 우수하고 풍부하며 빠르게 구현이 가능합니다.따라서 델이 원하는 대로 사용해 보십시오.

언급URL : https://stackoverflow.com/questions/766956/how-do-i-create-a-right-click-context-menu-in-java-swing

반응형