Java: щелкните правой кнопкой мыши Копировать Вырезать Вставить в текстовом поле

Я сделал программу, которая печатает значение в текстовом поле. Проблема в том, что когда пользователь щелкает правой кнопкой мыши в текстовом поле, такое меню не открывается:

введите здесь описание изображения

Есть ли способ, которым пользователь может открыть это меню при щелчке правой кнопкой мыши?

Это мой код:

public class A extends JFrame{
private JTextField txt1;
private JTextField txt2;
private JLabel val;
private JLabel prt;
private JButton bt1;


    public A() {

    getContentPane().setLayout(null);

    txt1 = new JTextField();
    txt1.setBounds(178, 93, 87, 28);
    getContentPane().add(txt1);


    txt2 = new JTextField();
    txt2.setBounds(178, 148, 87, 28);
    getContentPane().add(txt2);


    val = new JLabel("Enter Value");
    val.setBounds(84, 93, 69, 28);
    getContentPane().add(val);

    prt = new JLabel("Printed Value");
    prt.setBounds(80, 148, 87, 28);
    getContentPane().add(prt);



    bt1 = new JButton("Click This");
    bt1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

        int n=Integer.parseInt(txt1.getText());
        txt2.setText(n+"");


        }
    });
    bt1.setBounds(178, 188, 105, 28);
    getContentPane().add(bt1);

        setSize(400, 399);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);   

    }
}

Основной метод:

public class Main {

    public static void main(String[] args) {


        A object = new A(); 
    }

}

person Ven Nilson    schedule 06.06.2015    source источник


Ответы (3)


Ознакомьтесь с руководством по Swing на странице Как использовать меню, чтобы узнать об основах создание всплывающего меню.

Затем вы можете использовать Actions, предоставленный DefaultEditorKit, для создания всплывающего меню.

Для действия «Удалить» вам нужно будет создать собственное действие. Ознакомьтесь с руководством по Swing Как использовать действия, чтобы узнать об основах. За исключением того, что вы расширили бы TextAction, так как у него есть методы, которые позволяют вам получить доступ к текстовому компоненту с фокусом, чтобы вы могли создавать повторно используемый код.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class TextFieldPopup extends JPanel
{
    public TextFieldPopup()
    {
        JTextField textField = new JTextField(10);
        add( textField );

        JPopupMenu menu = new JPopupMenu();
        Action cut = new DefaultEditorKit.CutAction();
        cut.putValue(Action.NAME, "Cut");
        cut.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control X"));
        menu.add( cut );

        Action copy = new DefaultEditorKit.CopyAction();
        copy.putValue(Action.NAME, "Copy");
        copy.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control C"));
        menu.add( copy );

        Action paste = new DefaultEditorKit.PasteAction();
        paste.putValue(Action.NAME, "Paste");
        paste.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control V"));
        menu.add( paste );

        Action selectAll = new SelectAll();
        menu.add( selectAll );

        textField.setComponentPopupMenu( menu );
    }

    static class SelectAll extends TextAction
    {
        public SelectAll()
        {
            super("Select All");
            putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control S"));
        }

        public void actionPerformed(ActionEvent e)
        {
            JTextComponent component = getFocusedComponent();
            component.selectAll();
            component.requestFocusInWindow();
        }
    }


    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("TextFieldPopup");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TextFieldPopup() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
person camickr    schedule 06.06.2015
comment
Вам не нужны ускорители для вырезания, копирования и вставки, поскольку они используются по умолчанию. Ctrl+S не будет работать для Select All, так как ускорители работают только для видимых компонентов в графическом интерфейсе. Ctrl+S будет работать только тогда, когда всплывающее окно видимо. Я определил ускоритель в действии, потому что действие также может быть в JButton, и в этом случае ускоритель будет работать. Я предполагаю, что ускоритель следует удалить из действия, так как он вводит в заблуждение, потому что на самом деле он не работает, как другие ярлыки. Вы можете оставить ускорители вырезания, копирования и вставки, поскольку они работают. - person camickr; 07.06.2015
comment
Есть ли особая причина, по которой расширение JPanel лучше, чем расширение самого JTextField? - person Alex; 29.11.2016

Статический класс для мгновенного добавления обычного всплывающего меню в текстовое поле.

import javax.swing.*;
import java.awt.event.ActionEvent;
import javax.swing.undo.*;


public class JTextFieldRegularPopupMenu {
    public static void addTo(JTextField txtField) 
    {
        JPopupMenu popup = new JPopupMenu();
        UndoManager undoManager = new UndoManager();
        txtField.getDocument().addUndoableEditListener(undoManager);

        Action undoAction = new AbstractAction("Undo") {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if (undoManager.canUndo()) {
                    undoManager.undo();
                }
                else {
                   System.out.println("No Undo Buffer.");
                }
            }
        };

       Action copyAction = new AbstractAction("Copy") {
            @Override
            public void actionPerformed(ActionEvent ae) {
                txtField.copy();
            }
        };

        Action cutAction = new AbstractAction("Cut") {
            @Override
            public void actionPerformed(ActionEvent ae) {
                txtField.cut();
            }
        };

        Action pasteAction = new AbstractAction("Paste") {
            @Override
            public void actionPerformed(ActionEvent ae) {
                txtField.paste();
            }
        };

        Action selectAllAction = new AbstractAction("Select All") {
            @Override
            public void actionPerformed(ActionEvent ae) {
                txtField.selectAll();
            }
        };

        cutAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control X"));
        copyAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control C"));
        pasteAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control V"));
        selectAllAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control A"));

        popup.add (undoAction);
        popup.addSeparator();
        popup.add (cutAction);
        popup.add (copyAction);
        popup.add (pasteAction);
        popup.addSeparator();
        popup.add (selectAllAction);

       txtField.setComponentPopupMenu(popup);
    }
}

Использование:

JTextFieldRegularPopupMenu.addTo(jTxtMsg);

Мгновенно добавляет всплывающее меню к выбранному JTextFIeld.

person Karlo Kokkak    schedule 02.01.2018

Я бы начал с Как использовать меню и Вызов всплывающего меню (хотя лично я бы использовал JComponent#setComponentPopupMenu MouseListener)

Затем я бы посмотрел на JTextField#copy, JTextField#cut и JTextField#paste

person MadProgrammer    schedule 06.06.2015