2012-01-26 5 views
4

私はNetbeansを使用してWindowsで使用されるアプリケーションを開発しています。右クリックしてコピーまたは貼り付けすることができないことに気付きました。どうすればこの機能を有効にできますか? (私はそのような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

それは、オペレーティングシステムと対話していますか?私はなぜ、なぜテキストファイルにテキストエリアの内容を記述しないで、コピー&ペーストをmanualllyするユーザーをわざわざ

..私のJavaアプリケーションから何かをコピーしてメモ帳に貼り付けたいですか?

+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); 
    } 
} 
関連する問題