2015-06-06 3 views
2

Я создал программу, которая печатает значение в текстовом поле. Проблема заключается в том, что, когда пользователь щелкает правый в текстовом поле, меню, как это не откроется:Java: Щелкните правой кнопкой мыши Copy Cut Paste On TextField

enter image description here

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

Это мой код:

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

} 

ответ

10

Прочтите учебник Swing по телефону How to Use Menus для создания всплывающего меню.

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

Для действия «Удалить» вам необходимо создать свое собственное действие. Прочтите учебник Swing на странице How to Use Actions. Кроме того, вы будете расширять 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(); 
      } 
     }); 
    } 
} 
+0

Горячие клавиши не работают –

+0

Yyou не нужны ускорители для вырезания, копирования и вставки, поскольку они являются значениями по умолчанию. Ctrl + S не будет работать для Select All, поскольку ускорители работают только для видимых компонентов в графическом интерфейсе. Ctrl + S будет работать только тогда, когда всплывающее окно будет видимым. Я определил ускоритель в действии, потому что действие также может быть в JButton, и в этом случае ускоритель будет работать. Я думаю, ускоритель должен быть удален из действия, поскольку он вводит в заблуждение, потому что он не работает, как другие ярлыки. Вы можете оставить вырезать, скопировать, вставить ускорители, так как они работают. – camickr

+0

Есть ли какая-то особая причина, заключающаяся в расширении JPanel, лучше, чем расширение самого JTextField? – Alex

0

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

import javax.swing.*; 

import java.awt.event.ActionEvent; 
import javax.swing.JPopupMenu; 
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 { 
        JOptionPane.showMessageDialog(null, 
          "Undoable: " + undoManager.canUndo() , 
          "Message from Text Field", 
          JOptionPane.INFORMATION_MESSAGE); 
       } 
      } 
     }; 

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

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

     txtField.setComponentPopupMenu(popup); 
    } 
} 
+0

просто вызывают JTextFieldRegularPopupMenu.addTo (jTxtMsg); –

Смежные вопросы