疯狂Java讲义432页习题CopyPerson出错(未解决)

来源:互联网 发布:阿里云服务器遭到攻击 编辑:程序博客网 时间:2024/05/16 08:18

用LocalObjectSelection实现Transferable接口。代码如下:
package test20160315;

import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.io.IOException;//LocalObjectSelection实现Transferable接口。public class LocalObjectSelection implements Transferable {    private Object obj;    public LocalObjectSelection(Object obj) {        this.obj = obj;    }    @Override    public Object getTransferData(DataFlavor arg0) throws UnsupportedFlavorException, IOException {        // TODO Auto-generated method stub        if (!isDataFlavorSupported(arg0)) {            throw new UnsupportedFlavorException(arg0);        } else if (arg0.equals(DataFlavor.stringFlavor)) {            return obj.toString();        } else            return obj;    }    @Override    public DataFlavor[] getTransferDataFlavors() {        // TODO Auto-generated method stub        DataFlavor[] df = new DataFlavor[2];        @SuppressWarnings("rawtypes")        Class c = obj.getClass();        String mimeType = "application/x-java-jvm-local-objectref;" + "class=" + c.getName();                        //"application/x-java-jvm-local-objectref;class=Person"        try {            df[0] = new DataFlavor(mimeType);            df[1] = DataFlavor.stringFlavor;            return df;        } catch (ClassNotFoundException e) {            e.printStackTrace();            return null;        }    }    @Override    public boolean isDataFlavorSupported(DataFlavor arg0) {        // TODO Auto-generated method stub        return arg0.equals(DataFlavor.stringFlavor)|| arg0.getPrimaryType().equals("application") && arg0.getSubType().equals("x-java-jvm-local-objectref")&& arg0.getRepresentationClass().isAssignableFrom(obj.getClass());    }}

Person类的代码如下:

package test20160315;    //普通人类public class Person {    // 人的属性    // 年龄    int age;    // 姓名    String name;    public Person(String name, int age) {        this.age = age;        this.name = name;    }}

CopyPerson类的代码如下:

package test20160315;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;import java.awt.Label;import java.awt.Panel;import java.awt.TextArea;import java.awt.TextField;import java.awt.datatransfer.Clipboard;import java.awt.datatransfer.DataFlavor;public class CopyPerson {    private Frame f = new Frame("CopyPerson");    private TextField name = new TextField(15);    private TextField age = new TextField(15);    private TextArea ta = new TextArea(3, 15);    private Button copy = new Button("copy");    private Button paste = new Button("paste");    private Panel first = new Panel();    private Panel last = new Panel();    private Clipboard clipboard = new Clipboard("cp");    public void init() {        first.add(new Label("name"));        first.add(name);        first.add(new Label("age"));        first.add(age);        f.add(first, BorderLayout.NORTH);        f.add(ta, BorderLayout.CENTER);        copy.addActionListener(e -> copyPerson());        paste.addActionListener(e -> {            try {                readPerson();            } catch (Exception e1) {                e1.printStackTrace();            }        });        last.add(copy);        last.add(paste);        f.add(last, BorderLayout.SOUTH);        f.pack();        f.setVisible(true);    }    public static void main(String[] args) {        // TODO Auto-generated method stub        new CopyPerson().init();    }    public void copyPerson() {        Person p = new Person(name.getText(), Integer.parseInt(age.getText()));        LocalObjectSelection ls = new LocalObjectSelection(p);        clipboard.setContents(ls, null);    }    public void readPerson() throws Exception {        try {            DataFlavor personFlavor = new DataFlavor("application/x-java-jvm-local-objectref;class=Person");            if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {                Person p = (Person) clipboard.getData(personFlavor);                ta.setText(p.toString());            }        } catch (ClassNotFoundException e1) {            e1.printStackTrace();            System.out.println("not found Person");        } catch (Exception e) {            e.printStackTrace();        }    }}

运行单击copy无任何提示,单击paste按钮出错。错误信息如下:

java.lang.ClassNotFoundException: Person
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.awt.datatransfer.DataFlavor.tryToLoadClass(Unknown Source)
at java.awt.datatransfer.DataFlavor.initialize(Unknown Source)
at java.awt.datatransfer.DataFlavor.init(Unknown Source)
at test20160315.CopyPerson.lambda1(CopyPerson.java:35)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.access500(Unknown Source)
at java.awt.EventQueue3.run(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

感觉问题出在CopyPerson类的60行代码上

DataFlavor personFlavor = new DataFlavor("application/x-java-jvm-local-objectref;class=Person");

仔细核对,与书上代码一致。将Person中P小写,错误依旧。目前还没有找到原因。

0 0