我在JTree上面添加了键盘按键的操作,支持了系统组合键“Ctrl + C”、“Ctrl + V”这些方法的实现(原先只支持鼠标),但是在使用键盘的组合键进行复制粘贴的时候出现了问题:每次当使用的Copy()方法复制选中节点,然后用Paste()方法粘贴的时候,就会蹦出下面这些奇怪的空指针错误(看提示是发生在按键线程里):Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTreeUI$Handler.isNavigationKey(BasicTreeUI.java:3346)
at javax.swing.plaf.basic.BasicTreeUI$Handler.keyPressed(BasicTreeUI.java:3330)
at java.awt.AWTEventMulticaster.keyPressed(AWTEventMulticaster.java:192)
at java.awt.Component.processKeyEvent(Component.java:5446)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2713)
at java.awt.Component.processEvent(Component.java:5265)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1810)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:672)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:920)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:798)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:636)
at java.awt.Component.dispatchEventImpl(Component.java:3841)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Window.dispatchEventImpl(Window.java:1774)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)以下是我按键的判断代码:
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();if (e.isControlDown())
{
if (keyCode == KeyEvent.VK_C) //拷贝
{
Copy();
} else
if (keyCode == KeyEvent.VK_V) //粘贴
{
Paste();
} else
if (keyCode == KeyEvent.VK_X)
{
Cut();
}
} else
{
if (keyCode == KeyEvent.VK_DELETE)
{
this.Delete() ;
} else
if (keyCode == KeyEvent.VK_INSERT)
{
this.newChild(false,false,null) ;
} else
if (keyCode == KeyEvent.VK_HOME)
{
this.refresh();
}
}
}
//Paste函数的代码
public DefaultMutableTreeNode copyTreeNode[] = null;//系统拷贝好的节点的数组,因为tree支持选中多个列表后一起拷贝。
public int Paste()
{
return Paste(false,copyTreeNode) ;
}
public int Paste(boolean currentPosition,DefaultMutableTreeNode copyNode[])
{
try
{
if (copyNode == null)
{
return this.FAILED;
}DefaultMutableTreeNode root = (DefaultMutableTreeNode)this.
getSelectNode();
DefaultMutableTreeNode pasteNode;if (root.isRoot()) //判断复制的节点是根节点的情况
{
pasteNode = rootNode;
} else
{
if (this.isData(root) || currentPosition) //如果要粘贴的是数据或者是需要复制到当前位置,自动粘贴到与数据同目录下,如果是列表,粘贴到列表下。
{
pasteNode = (DefaultMutableTreeNode) root.
getParent();
} else
{
pasteNode = (DefaultMutableTreeNode) root;
}
}for (int i = 0; i < copyTreeNode.length; i++)
{
Object obj = AppFunction.Clone(copyNode[i]);
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode)
obj;
pasteNode.insert(node1, this.getChildNum(pasteNode));
}
copyTreeNode = null;
this.refresh();
return this.SUCCESS;
} catch (Exception ex)
{
ex.printStackTrace();
return FAILED;
}
}最令人费解的就是,这个问题只有在用键盘使用Ctrl + V的时候才会出现,鼠标的复制、粘贴功能与键盘的Ctrl + C、Ctrl +V方法都是调用的Copy()和Paste()方法,而且用鼠标操作没有任何错误。在网上查了查,说是有未分配的按键值,但是我怎么也查不到啊!请高手指点!!!