Java:右键单击文本字段上的复制剪切粘贴

Java:右键单击文本字段上的复制剪切粘贴,java,swing,Java,Swing,我制作了一个程序,在文本字段中打印一个值。问题是,当用户在文本字段中单击鼠标右键时,这样的菜单将无法打开: 有没有一种方法可以让用户在右键单击时打开此菜单? 这是我的代码: public class A extends JFrame{ private JTextField txt1; private JTextField txt2; private JLabel val; private JLabel prt; private JButton bt1; public A() {

我制作了一个程序,在文本字段中打印一个值。问题是,当用户在文本字段中单击鼠标右键时,这样的菜单将无法打开:


有没有一种方法可以让用户在右键单击时打开此菜单?

这是我的代码:

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(); 
    }

}
我会从and开始(尽管我个人会使用and而不是
鼠标听筒


然后我将看一看,并阅读上的Swing教程,了解创建弹出菜单的基本知识

然后,您可以使用
DefaultEditorKit
提供的
Actions
创建弹出菜单

对于“删除”操作,您需要创建自己的自定义操作。阅读上的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();
            }
        });
    }
}

静态类立即将常规弹出菜单添加到文本字段

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。

y剪切、复制和粘贴不需要加速器,因为这些是默认设置。Ctrl+S将不适用于全选,因为加速器仅适用于GUI上的可见组件。Ctrl+S仅在弹出窗口可见时才起作用。我在动作中定义了加速器,因为动作也可以在JButton中,在这种情况下加速器可以工作。我想应该从操作中删除加速器,因为它具有误导性,因为它实际上不像其他快捷方式那样工作。你可以保留剪切、复制、粘贴加速器,因为它们可以工作。有没有特别的原因让扩展JPanel比扩展JTextField本身更好?