2012-01-26 46 views
4

我正在使用Netbeans開發將在Windows中使用的應用程序。我注意到我無法右鍵單擊來複制或粘貼。我怎樣才能啓用它? (我使用基本的Swing控件,如JText和JTextArea中。)右鍵單擊以複製並粘貼到Java

回答

12

Why right click is not working on java application?

我不會創造新的複製,剪切,粘貼,撤消&選擇所有的行動,因爲這些已經各自的ActionMap中內部存在零件。我只是這樣做:

Action copyAction = textField.getActionMap().get("copy"); 
Action cutAction = textField.getActionMap().get("cut"); 
Action pasteAction = textField.getActionMap().get("paste"); 
Action undoAction = textField.getActionMap().get("undo"); 
Action selectAllAction = textField.getActionMap().get("selectAll"); 


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

return popup; 

這樣你就不會重新創建更多已寫入的代碼。除此之外,我會遵循這個例子。

+0

它是否與操作系統交互?我想從Java應用程序中複製一些內容並粘貼到記事本中... – averageman

+1

是的。默認操作使用系統的剪貼板類,以便在Java Swing中的任何應用程序之間進行復制和粘貼。 – chubbsondubs

+0

謝謝!我會稍後嘗試! – averageman

1

的評論,

是否與操作系統交互?我想從我的Java應用程序複製的東西,貼在記事本..

何苦用戶manuallly複製粘貼,爲什麼textarea的內容不寫入一個文本文件?

+1

長篇故事......但用戶想自己做,而不打開文本文件。 :) – averageman

1
final int colx; 
final int rowy; 
final String val1; 

colx = CFDTable.getSelectedColumn(); 
rowy = CFDTable.getSelectedRow(); 

val1 = (String) CFDTable.getValueAt(rowy, colx); 
JPopupMenu jPopupMenu = new javax.swing.JPopupMenu(); 
jPopupMenu.setName("jPopupMenu"); 
CFDTable.setComponentPopupMenu(jPopupMenu); 
JMenuItem jMenuItem = new javax.swing.JMenuItem(); 
jMenuItem.setText("Copy"); // NOI18N 
jMenuItem.setName("jMenuItem"); // NOI18N 
jPopupMenu.add(jMenuItem); 

jMenuItem.addActionListener(new ActionListener() { 
public void actionPerformed(ActionEvent e) { 
StringSelection entry = new StringSelection(val1); 
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
clipboard.setContents(entry, entry); 
} 
}); 
0

任何JTextComponent的完整工作模型,包括非功能性操作以及在文本選擇狀態下啓用/禁用菜單項。

private JMenuItem composeMenuItemFromActionOfComponent(String actionTag, JComponent component, String text, String idTag){ 
    Action action = component.getActionMap().get(actionTag); 
    JMenuItem menuItem = new JMenuItem(action); 
    menuItem.setText(text); 
    menuItem.putClientProperty("id",idTag); 
    if(action == null) 
     menuItem.setEnabled(false); 
    return menuItem; 
} 
private void addTextMenuItems(JTextComponent textField){ 
    final JPopupMenu popup = new JPopupMenu(); 
    if(textField.isEditable()) { 
     popup.add(composeMenuItemFromActionOfComponent("undo", textField, "Undo", "undo")); 
     popup.addSeparator(); 
    } 
    popup.add (composeMenuItemFromActionOfComponent(DefaultEditorKit.copyAction,textField,"Copy", "copy")); 
    if(textField.isEditable()) { 
     popup.add(composeMenuItemFromActionOfComponent(DefaultEditorKit.cutAction, textField, "Cut", "cut")); 
     popup.add(composeMenuItemFromActionOfComponent(DefaultEditorKit.pasteAction, textField, "Paste", "paste")); 
     popup.addSeparator(); 
    } 
    popup.add (composeMenuItemFromActionOfComponent(DefaultEditorKit.selectAllAction,textField,"Select All", "select_all")); 

    textField.addMouseListener(new MouseListener() { 
     @Override 
     public void mouseClicked(MouseEvent e) {} 

     @Override 
     public void mousePressed(MouseEvent e) {} 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      if(e.isPopupTrigger()) { 
       boolean isTextSelected = textField.getSelectedText() != null; 
       for(MenuElement element : popup.getSubElements()){ 
        JMenuItem menuItem = ((JMenuItem) element); 
        if(menuItem.getAction() != null && menuItem.getAction().isEnabled()) { 
         if (isTextSelected){ 
          menuItem.setEnabled(true); 
         }else if (!(menuItem.getClientProperty("id").equals("select_all") 
           || menuItem.getClientProperty("id").equals("undo"))) 
          menuItem.setEnabled(false); 
        } 
        if(menuItem.getClientProperty("id").equals("paste")){ 
         boolean isPastAvailable = false; 
         for(DataFlavor flavor : Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors()){ 
          if(flavor.getRepresentationClass() == String.class){ 
           isPastAvailable = true; 
           break; 
          } 
         } 
         menuItem.setEnabled(isPastAvailable); 
        } 

       } 
       e.getComponent().requestFocus(); 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 

     } 

     @Override 
     public void mouseEntered(MouseEvent e) {} 

     @Override 
     public void mouseExited(MouseEvent e) {} 
    }); 
} 
0

靜態類,即時添加常規彈出菜單到文本框。

只需調用JTextFieldRegularPopupMenu.addTo(jTextFieldObj);

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() , 
          "Undo Status", 
          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); 
    } 
}