-
Bug
-
Resolution: Duplicate
-
P4
-
1.4.0, 1.4.2
-
x86
-
windows_nt, windows_2000
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-2119909 | 5.0u3 | Shannon Hickey | P4 | Closed | Duplicate |
FULL PRODUCT VERSION :
java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-
b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)
FULL OPERATING SYSTEM VERSION :
Microsoft Windows 2000 [Version
5.00.2195]
ADDITIONAL OPERATING SYSTEMS :
Also on Linux
A DESCRIPTION OF THE PROBLEM :
JTrees with enabled drop support produce NullPointerExceptions when
setUI() was called on them.
It doesn't matter which TreeUI is used
(Windows, Metal, Basic, as soon as the TreeUI is changed the failure
appears.
This bug appears on Windows and Linux.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1.Compile and execute the program
2.Select with a click a component of
the left JTree
3.Drag this component to the textarea
4.Do steps 2+3
with the right JTree
5.You will see a NullPointerException on the
console
EXPECTED VERSUS ACTUAL BEHAVIOR :
The left JTree is working properly, whereas the right JTree produces
NullPointerExceptions when drags are moved out of the JTree.
Code is
working so far but there are NullPointerExceptions.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.NullPointerException
at
javax.swing.plaf.basic.BasicTreeUI$TreeDropTargetListener.restoreComponentState(BasicTreeUI.java:3680)
at
javax.swing.plaf.basic.BasicDropTargetListener.dragExit(BasicDropTargetListener.java:249)
at javax.swing.TransferHandler$SwingDropTarget.dragExit(TransferHandler.java:579)
at
sun.awt.dnd.SunDropTargetContextPeer.processExitMessage(SunDropTargetContextPeer.java:396)
at
sun.awt.dnd.SunDropTargetContextPeer.access$700(SunDropTargetContextPeer.java:52)
at
sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchExitEvent(SunDropTargetContextPeer.java:793)
at
sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:741)
at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:29)
at
java.awt.Component.dispatchEventImpl(Component.java:3384)
at
java.awt.Container.dispatchEventImpl(Container.java:1437)
at
java.awt.Component.dispatchEvent(Component.java:3367)
at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3214)
at
java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:3046)
at
java.awt.LightweightDispatcher.processDropTargetEvent(Container.java:2992)
at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:2854)
at
java.awt.Container.dispatchEventImpl(Container.java:1423)
at
java.awt.Window.dispatchEventImpl(Window.java:1566)
at
java.awt.Component.dispatchEvent(Component.java:3367)
at
java.awt.EventQueue.dispatchEvent(EventQueue.java:445)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:190)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:144)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:130)
at
java.awt.EventDispatchThread.run(EventDispatchThread.java:98)
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.awt.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import
java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import
javax.swing.tree.*;
import javax.swing.plaf.metal.MetalTreeUI;
public class
PanTree extends JFrame {
private JTree jtree;
private JTree ofjtree;
private
JScrollPane jscp;
private JScrollPane ofjscp;
public static void main(String args[]){
PanTree pt = new PanTree();
}
public PanTree(){
super();
try{
UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
}catch
(Exception e){
System.err.println(e);
}
getContentPane().setLayout(new
FlowLayout());
setSize(800,500);
jtree = new JTree();
jtree.setDragEnabled(true);
jtree.setTransferHandler(new TreeTransferHandler());
jtree.setScrollsOnExpand(true);
jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
jscp = new JScrollPane(jtree);
ofjtree = new JTree();
ofjtree.setDragEnabled(true);
ofjtree.setTransferHandler(new
TreeTransferHandler());
ofjtree.setScrollsOnExpand(true);
ofjtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
ofjtree.setUI(new MetalTreeUI()); // this causes NullPointerExceptions
ofjscp = new
JScrollPane(ofjtree);
JTextArea textarea = new JTextArea(30,30);
textarea.setDragEnabled(true);
getContentPane().add(jscp);
getContentPane().add(textarea);
getContentPane().add(ofjscp);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.out.println("trying to exit");
System.exit(0);
}
});
pack();
setVisible(true);
}
class TreeTransferHandler extends TransferHandler{
private
DataFlavor[] plainFlavors = null;
TreeTransferHandler(){
super();
try {
plainFlavors = new DataFlavor[1];
plainFlavors[0] = new
DataFlavor("text/plain;class=java.lang.String");
}catch (ClassNotFoundException
cle){
System.err.println("error initializing TreeTransferable");
}
}
protected
Transferable createTransferable(JComponent c) {
if (c instanceof JTree) {
JTree tree =
(JTree) c;
TreePath path = tree.getSelectionPath();
return new TreeTransferable(tree,
path);
}
return null;
}
public int getSourceActions(JComponent c) {
return
COPY;
}
public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
return true;
}
class TreeTransferable implements Transferable{
private TreePath
path;
private JTree tree;
TreeTransferable(JTree tree, TreePath path) {
this.path =
path;
this.tree = tree;
}
public DataFlavor[] getTransferDataFlavors() {
return
plainFlavors;
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
for (int
i = 0; i < plainFlavors.length; i++) {
if (plainFlavors[i].equals(flavor)) {
return
true;
}
}
return false;
}
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException{
String data = getPlainData();
data = (data == null) ?
"" : data;
if (String.class.equals(flavor.getRepresentationClass())) {
return data;
}
throw new UnsupportedFlavorException(flavor);
}
protected String getPlainData()
{
TreeModel model = tree.getModel();
Object node = path.getLastPathComponent();
return path.toString()+"\n";
}
}
}
}
---------- END SOURCE ----------
CUSTOMER WORKAROUND :
Do not call setUI() on JTrees when using dop!
Release Regression From : 1.4
The above release value was the last known release where this
bug was known to work. Since then there has been a regression.
(Review ID: 144125)
======================================================================
- backported by
-
JDK-2119909 JTree DnD conflicts with JTree.setUI(..)
-
- Closed
-
- duplicates
-
JDK-4735546 NPE in BasicTableUI during Swing drag and drop
-
- Closed
-
-
JDK-4846941 General Drag and Drop conflicts with setUI
-
- Closed
-
-
JDK-4468566 Swing DnD should not use selection to show drop location
-
- Resolved
-
- relates to
-
JDK-6310757 NPE drag-n-drop a swing JTree node (from a JPanel) onto an empty JPanel
-
- Closed
-
-
JDK-4942851 canImport should carry Transferable in TransferHandler
-
- Resolved
-
-
JDK-6406385 DropTargetListener listeners are accumulated in an uncontrolled way
-
- Closed
-