📄 popupeditmenumanager.java
字号:
package client.tools;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Element;
import javax.swing.text.JTextComponent;
import javax.swing.text.StyleConstants;
/**
* 本类可以为文本域添加弹出编辑菜单项,菜单项包括:复制,粘贴,剪切,全选,不提供对JTextPane,JEditorPane的支持
*
* @author Elegate
*/
public final class PopupEditMenuManager
{
/**
* 为指定的JTextComponent 添加弹出菜单
*
* @param txtComponent
* 文本域
*/
public static void addPopupEditMenu(JTextComponent txtComponent)
{
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem mnuCut = new JMenuItem("剪切");
mnuCut.addActionListener(new CutL(txtComponent));
JMenuItem mnuCopy = new JMenuItem("拷贝");
mnuCopy.addActionListener(new CopyL(txtComponent));
JMenuItem mnuPaste = new JMenuItem("粘贴");
mnuPaste.addActionListener(new PasteL(txtComponent));
JMenuItem mnuSelectAll = new JMenuItem("全选");
mnuSelectAll.addActionListener(new SelectAllL(txtComponent));
popupMenu.add(mnuCut);
popupMenu.add(mnuCopy);
popupMenu.add(mnuPaste);
popupMenu.add(mnuSelectAll);
txtComponent.add(popupMenu);
txtComponent.addMouseListener(new MouseL(popupMenu, txtComponent,
mnuCut, mnuPaste));
}
private static class MouseL extends MouseAdapter
{
private JPopupMenu popupMenu;
private JTextComponent txtComp;
private JMenuItem mnuCut;
private JMenuItem mnuPaste;
public MouseL(JPopupMenu popup, JTextComponent txtComp,
JMenuItem mnuCut, JMenuItem mnuPaste)
{
this.popupMenu = popup;
this.txtComp = txtComp;
this.mnuCut = mnuCut;
this.mnuPaste = mnuPaste;
}
public void mouseClicked(MouseEvent me)
{
if (me.getButton() == MouseEvent.BUTTON3 && me.getClickCount() == 1)
{
if (txtComp.isEditable())
{
mnuCut.setEnabled(true);
mnuPaste.setEnabled(true);
}
else
{
mnuCut.setEnabled(false);
mnuPaste.setEnabled(false);
}
if (txtComp instanceof JTextPane)
{
mnuPaste.setEnabled(true);
}
Point p = me.getPoint();
popupMenu.show(txtComp, p.x, p.y);
}
}
}
/**
* 复制菜单的响应函数
*
* @author Elegate
*/
private static class CopyL implements ActionListener
{
private JTextComponent txtComp;
public CopyL(JTextComponent txtComp)
{
this.txtComp = txtComp;
}
public void actionPerformed(ActionEvent e)
{
if (this.txtComp instanceof JTextPane)
{
JTextPane pane = (JTextPane) this.txtComp;
DefaultStyledDocument dsd = (DefaultStyledDocument) pane
.getStyledDocument();
Element ele = dsd.getParagraphElement(0).getElement(0);
if (ele.getName().equals("icon"))
{
ImageIcon icon = (ImageIcon) StyleConstants.getIcon(ele
.getAttributes());
ImageSelection imageSelection = new ImageSelection(icon
.getImage());
Clipboard cb = Toolkit.getDefaultToolkit()
.getSystemClipboard();
cb.setContents(imageSelection, null);
}
}
else
{
txtComp.copy();
}
}
}
/**
* 剪切菜单的响应函数
*
* @author Elegate
*/
private static class CutL implements ActionListener
{
private JTextComponent txtComp;
public CutL(JTextComponent txtComp)
{
this.txtComp = txtComp;
}
public void actionPerformed(ActionEvent e)
{
txtComp.cut();
}
}
/**
* 粘贴菜单的响应函数
*
* @author Elegate
*/
private static class PasteL implements ActionListener
{
private JTextComponent txtComp;
public PasteL(JTextComponent txtComp)
{
this.txtComp = txtComp;
}
public void actionPerformed(ActionEvent e)
{
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable contents = cb.getContents(null);
if (contents != null
&& contents.isDataFlavorSupported(DataFlavor.stringFlavor))
{
txtComp.paste();
}
else if (contents != null
&& contents.isDataFlavorSupported(DataFlavor.imageFlavor))
{
try
{
Image img = (Image) contents
.getTransferData(DataFlavor.imageFlavor);
Icon icon = new ImageIcon(img);
if (txtComp instanceof JTextPane)
{
txtComp.setText("");
((JTextPane) txtComp).insertIcon(icon);
}
}
catch (UnsupportedFlavorException ex)
{
JOptionPane.showMessageDialog(null, ex, "Error",
JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
catch (IOException exp)
{
exp.printStackTrace();
}
}
}
}
/**
* 全选菜单的响应函数
*
* @author Elegate
*/
private static class SelectAllL implements ActionListener
{
private JTextComponent txtComp;
public SelectAllL(JTextComponent txtComp)
{
this.txtComp = txtComp;
}
public void actionPerformed(ActionEvent e)
{
int l = txtComp.getText().length();
txtComp.setSelectionStart(0);
txtComp.setSelectionEnd(l);
}
}
}
/**
* 提供剪贴版的图片数据传送
*
* @author Elegate
*/
class ImageSelection implements Transferable
{
public ImageSelection(Image image)
{
this.image = image;
}
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (flavor.equals(DataFlavor.imageFlavor))
{
return image;
}
else
{
throw new UnsupportedFlavorException(flavor);
}
}
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]
{ DataFlavor.imageFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DataFlavor.imageFlavor.equals(flavor);
}
private Image image;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -