使用情景:
关于Java Applet使用Client和Net两种启动方式时复制粘贴的实现
MyApplet.java
import java.awt.BorderLayout;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.JTextComponent;
public class MyApplet extends JApplet {
private String startType = "net";
private CopyPasteMenu copyPasteMenu;
private JPanel jpContext;
@Override
public void init() {
jpContext = new JPanel(new BorderLayout());
this.getContentPane().add(jpContext);
initComponent();
}
public void setStartType(String startType) {
this.startType = startType;
}
public void setCopyPasteMenu(CopyPasteMenu copyPasteMenu) {
this.copyPasteMenu = copyPasteMenu;
}
public JPanel getContextPanel() {
return jpContext;
}
private void initComponent() {
JTextArea jTextArea = new JTextArea();
jTextArea.addMouseListener(new CopyPasteMenu(jTextArea, this));
JScrollPane jsp = new JScrollPane(jTextArea);
jpContext.add(jsp, BorderLayout.CENTER);
}
public boolean isNetStart() {
return startType.equals("net");
}
public boolean isClientStart() {
return startType.equals("client");
}
public String dealTextCopy(String value) {
if (value == null || "null".equals(value)) {
return "";
}
value = decodeByUTF8(value);
JTextComponent jTextComponent = copyPasteMenu.getjTextComponent();
jTextComponent.replaceSelection(value);
return jTextComponent.getText();
}
public String encodeByUTF8(String value) {
String str = "";
if (value != null) {
try {
str = URLEncoder.encode(value, "UTF-8");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
}
return str;
}
public String decodeByUTF8(String value) {
String str = "";
if (value != null) {
try {
str = URLDecoder.decode(value, "UTF-8");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
}
return str;
}
public static void main(String[] args) {
MyApplet myApplet = new MyApplet();
myApplet.setStartType("client");
myApplet.init();
JFrame jFrame = new JFrame("Test Copy/Paste");
jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
jFrame.setSize(300, 300);
jFrame.getContentPane().add(myApplet.getContextPanel());
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
}
}
CopyPasteMenu.java
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.text.JTextComponent;
import netscape.javascript.JSObject;
public class CopyPasteMenu extends MouseAdapter implements ActionListener {
public static final String CUT = "Cut";
public static final String COPY = "Copy";
public static final String PASTE = "Paste";
private JPopupMenu popupMenu;
private JMenuItem jmiCopy, jmiPaste, jmiCut;
private JTextComponent jTextComponent;
MyApplet target;
public CopyPasteMenu(JTextComponent jTextComponent, MyApplet target) {
this.jTextComponent = jTextComponent;
this.target = target;
popupMenu = new JPopupMenu();
jmiCut = new JMenuItem(CUT);
jmiCopy = new JMenuItem(COPY);
jmiPaste = new JMenuItem(PASTE);
jmiCut.setAccelerator(KeyStroke.getKeyStroke('X', InputEvent.CTRL_MASK));
jmiCopy.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK));
jmiPaste.setAccelerator(KeyStroke.getKeyStroke('V', InputEvent.CTRL_MASK));
jmiCut.addActionListener(this);
jmiCopy.addActionListener(this);
jmiPaste.addActionListener(this);
popupMenu.add(jmiCut);
popupMenu.add(jmiCopy);
popupMenu.add(jmiPaste);
jTextComponent.addMouseListener(this);
jTextComponent.registerKeyboardAction(this, CUT, KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK), JComponent.WHEN_FOCUSED);
jTextComponent.registerKeyboardAction(this, PASTE, KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK), JComponent.WHEN_FOCUSED);
jTextComponent.registerKeyboardAction(this, COPY, KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK), JComponent.WHEN_FOCUSED);
}
public boolean isCanCopy() {
String selectedText = jTextComponent.getSelectedText();
if (selectedText == null || selectedText.equals("")) {
return false;
} else {
return true;
}
}
public JTextComponent getjTextComponent() {
return jTextComponent;
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
jmiCut.setEnabled(isCanCopy());
jmiCopy.setEnabled(isCanCopy());
jmiPaste.setEnabled(true);
popupMenu.show(jTextComponent, e.getX(), e.getY());
}
}
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
if (str.equals(CUT)) {
dealCopy();
jTextComponent.replaceSelection("");
} else if (str.equals(COPY)) {
dealCopy();
} else if (str.equals(PASTE)) {
dealPaste();
}
}
private void dealCopy() {
if (target.isNetStart()) {
String value = jTextComponent.getSelectedText();
JSObject.getWindow(target).eval("javascript:setClipboard('" + target.encodeByUTF8(value) + "')");
} else {
String selection = jTextComponent.getSelectedText();
StringSelection clipString = new StringSelection(selection);
Clipboard clipboard = target.getToolkit().getSystemClipboard();
clipboard.setContents(clipString, clipString);
}
}
private void dealPaste() {
try {
if (target.isNetStart()) {
target.setCopyPasteMenu(this);
JSObject.getWindow(target).eval("javascript:getTextClipData()");
} else {
Clipboard clipboard = target.getToolkit().getSystemClipboard();
Transferable clipData = clipboard.getContents("text");
String clipString = (String) clipData.getTransferData(DataFlavor.stringFlavor);
jTextComponent.replaceSelection(clipString);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
.jsp
function getTextClipData(){
var value;
value = getClipboard();
window.document.MyApplet.dealTextCopy(value);
}
function setClipboard(value) {
if (window.clipboardData) {
return (window.clipboardData.setData("text", value));
} else if (window.netscape) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip) {
return;
}
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans) {
return;
}
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
var copytext = value;
str.data=copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip) {
return false;
}
clip.setData(trans,null,clipid.kGlobalClipboard);
return true;
}
return false;
}