java Swing实现右键复制粘贴

  1. import java.awt.datatransfer.Clipboard;  
  2. import java.awt.datatransfer.DataFlavor;  
  3. import java.awt.datatransfer.Transferable;  
  4. import java.awt.event.ActionEvent;  
  5. import java.awt.event.ActionListener;  
  6. import java.awt.event.InputEvent;  
  7. import java.awt.event.MouseEvent;  
  8. import java.awt.event.MouseListener;  
  9.   
  10. import javax.swing.JFrame;  
  11. import javax.swing.JMenuItem;  
  12. import javax.swing.JPopupMenu;  
  13. import javax.swing.JScrollPane;  
  14. import javax.swing.JTextArea;  
  15. import javax.swing.KeyStroke;  
  16. import javax.swing.UIManager;  
  17.   
  18. /** 
  19. * Java右键菜单实现文本组件内容的的复制、粘贴、剪切功能 
  20.  
  21. */  
  22.   
  23. public class Test extends JFrame {  
  24.   
  25. private static final long serialVersionUID = -5942087991012920147L;  
  26.   
  27. private JScrollPane pane = null;  
  28.   
  29. private TextAreaMenu text = null;  
  30.   
  31. public Test() {  
  32.    super("右键菜单");  
  33.    try { // 使用Windows的界面风格   
  34.     UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");  
  35.    } catch (Exception e) {  
  36.     e.printStackTrace();  
  37.    }  
  38.    text = new TextAreaMenu();  
  39.    pane = new JScrollPane(text);  
  40.    this.getContentPane().add(pane);  
  41.    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  42.    this.setSize(300200);  
  43.    this.setVisible(true);  
  44. }  
  45.   
  46. public static void main(String args[]) {  
  47.    new Test();  
  48. }  
  49.   
  50. /** 
  51. * 带有功能菜单的JTextArea 
  52.  
  53. */  
  54. class TextAreaMenu extends JTextArea implements MouseListener {  
  55.   
  56.    private static final long serialVersionUID = -2308615404205560110L;  
  57.   
  58.    private JPopupMenu pop = null// 弹出菜单   
  59.   
  60.    private JMenuItem copy = null, paste = null, cut = null// 三个功能菜单   
  61.   
  62.    public TextAreaMenu() {  
  63.     super();  
  64.     init();  
  65.    }  
  66.   
  67.    private void init() {  
  68.     this.addMouseListener(this);  
  69.     pop = new JPopupMenu();  
  70.     pop.add(copy = new JMenuItem("复制"));  
  71.     pop.add(paste = new JMenuItem("粘贴"));  
  72.     pop.add(cut = new JMenuItem("剪切"));  
  73.     copy.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK));  
  74.     paste.setAccelerator(KeyStroke.getKeyStroke('V', InputEvent.CTRL_MASK));  
  75.     cut.setAccelerator(KeyStroke.getKeyStroke('X', InputEvent.CTRL_MASK));  
  76.     copy.addActionListener(new ActionListener() {  
  77.      public void actionPerformed(ActionEvent e) {  
  78.       action(e);  
  79.      }  
  80.     });  
  81.     paste.addActionListener(new ActionListener() {  
  82.      public void actionPerformed(ActionEvent e) {  
  83.       action(e);  
  84.      }  
  85.     });  
  86.     cut.addActionListener(new ActionListener() {  
  87.      public void actionPerformed(ActionEvent e) {  
  88.       action(e);  
  89.      }  
  90.     });  
  91.     this.add(pop);  
  92.    }  
  93.   
  94.    /** 
  95.    * 菜单动作 
  96.    * @param e 
  97.    */  
  98.    public void action(ActionEvent e) {  
  99.     String str = e.getActionCommand();  
  100.     if (str.equals(copy.getText())) { // 复制   
  101.      this.copy();  
  102.     } else if (str.equals(paste.getText())) { // 粘贴   
  103.      this.paste();  
  104.     } else if (str.equals(cut.getText())) { // 剪切   
  105.      this.cut();  
  106.     }  
  107.    }  
  108.   
  109.    public JPopupMenu getPop() {  
  110.     return pop;  
  111.    }  
  112.   
  113.    public void setPop(JPopupMenu pop) {  
  114.     this.pop = pop;  
  115.    }  
  116.   
  117.    /** 
  118.    * 剪切板中是否有文本数据可供粘贴 
  119.    *  
  120.    * @return true为有文本数据 
  121.    */  
  122.    public boolean isClipboardString() {  
  123.     boolean b = false;  
  124.     Clipboard clipboard = this.getToolkit().getSystemClipboard();  
  125.     Transferable content = clipboard.getContents(this);  
  126.     try {  
  127.      if (content.getTransferData(DataFlavor.stringFlavor) instanceof String) {  
  128.       b = true;  
  129.      }  
  130.     } catch (Exception e) {  
  131.     }  
  132.     return b;  
  133.    }  
  134.   
  135.    /** 
  136.    * 文本组件中是否具备复制的条件 
  137.    *  
  138.    * @return true为具备 
  139.    */  
  140.    public boolean isCanCopy() {  
  141.     boolean b = false;  
  142.     int start = this.getSelectionStart();  
  143.     int end = this.getSelectionEnd();  
  144.     if (start != end)  
  145.      b = true;  
  146.     return b;  
  147.    }  
  148.   
  149.    public void mouseClicked(MouseEvent e) {  
  150.    }  
  151.   
  152.    public void mouseEntered(MouseEvent e) {  
  153.    }  
  154.   
  155.    public void mouseExited(MouseEvent e) {  
  156.    }  
  157.   
  158.    public void mousePressed(MouseEvent e) {  
  159.     if (e.getButton() == MouseEvent.BUTTON3) {  
  160.      copy.setEnabled(isCanCopy());  
  161.      paste.setEnabled(isClipboardString());  
  162.      cut.setEnabled(isCanCopy());  
  163.      pop.show(this, e.getX(), e.getY());  
  164.     }  
  165.    }  
  166.   
  167.    public void mouseReleased(MouseEvent e) {  
  168.    }  
  169.   
  170. }  
  171.   
  172. }  
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值