United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-4468566 Swing DnD should not use selection to show drop location
JDK-4468566 : Swing DnD should not use selection to show drop location

Details
Type:
Enhancement
Submit Date:
2001-06-12
Status:
Resolved
Updated Date:
2005-11-21
Project Name:
JDK
Resolved Date:
2005-06-22
Component:
client-libs
OS:
solaris_9,windows_nt,linux,generic,windows_2000
Sub-Component:
javax.swing
CPU:
x86,sparc,generic
Priority:
P4
Resolution:
Fixed
Affected Versions:
1.4.0,1.4.2,5.0,5.0u3,5.0u6
Fixed Versions:

Related Reports
Backport:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Duplicate:
Relates:
Relates:
Relates:
Relates:
Relates:

Sub Tasks

Description
In Swing, the selection is used to show the point where a drop operation would occur. With text components, this is the caret. In JList, JTable, JTree, the selection is used.

This causes many complications. With text, playing with the caret causes the selection to be temporary lost as described in the report below. With the other components, using the selection makes it difficult to specify a drop above or below the current selection.

A new mechanism should be designed such that a drop location can be displayed without using the selection.

-----------------------------------
Original bug report:

Name: bsC130419			Date: 06/11/2001


java version "1.4.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b65)
Java HotSpot(TM) Client VM (build 1.4.0-beta-b65, mixed mode)

Dragging selected text from a text component deselects the original text. The
original text is deselected as soon as the drag starts. I expect the original
text to remain selected until the text is dropped on a target.
Set setDragEnabled on a JTextField, JTextArea, JTextPane, JFormattedTextField
or JEditorPane to true to select default drag operation. After selecting some
text and starting to drag, the text becomes unselected.
The example code shows a frame with each of the text components in it. The
components have had their default drag operation enabled so that drag and drop
of text can by played with. Select some text in any component and drag it. As
soon as the selected text is dragged the original text becomes unselected.

/*
 * Test.java
 *
 * Created on 6 June 2001, 16:08
 */


/**
 *
 * @author  daz
 * @version 1.0
 */
public class Test extends javax.swing.JFrame {

    /** Creates new form Test */
    public Test() {
        initComponents ();
        jFormattedTextField1 = new javax.swing.JFormattedTextField();
        jFormattedTextField1.setText("jFormattedTextField1");
        getContentPane().add(jFormattedTextField1);
        jTextArea1.setDragEnabled(true);
        jTextField1.setDragEnabled(true);
        jTextPane1.setDragEnabled(true);
        jEditorPane1.setDragEnabled(true);
        jFormattedTextField1.setDragEnabled(true);
        pack ();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the FormEditor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
      jTextArea1 = new javax.swing.JTextArea();
      jTextField1 = new javax.swing.JTextField();
      jTextPane1 = new javax.swing.JTextPane();
      jEditorPane1 = new javax.swing.JEditorPane();
      
      getContentPane().setLayout(new java.awt.GridLayout(0, 1));
      
      addWindowListener(new java.awt.event.WindowAdapter() {
        public void windowClosing(java.awt.event.WindowEvent evt) {
          exitForm(evt);
        }
      });
      
      jTextArea1.setText("jTextArea1");
      getContentPane().add(jTextArea1);
      
      jTextField1.setText("jTextField1");
      getContentPane().add(jTextField1);
      
      jTextPane1.setText("jTextPanel1");
      getContentPane().add(jTextPane1);
      
      jEditorPane1.setText("jEditorPane1");
      getContentPane().add(jEditorPane1);
      
    }//GEN-END:initComponents

    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-
FIRST:event_exitForm
        System.exit (0);
    }//GEN-LAST:event_exitForm

    /**
    * @param args the command line arguments
    */
    public static void main (String args[]) {
        new Test ().show ();
    }


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextPane jTextPane1;
    private javax.swing.JEditorPane jEditorPane1;
    // End of variables declaration//GEN-END:variables
    private javax.swing.JFormattedTextField jFormattedTextField1;
}
(Review ID: 126245) 
======================================================================

                                    

Comments
WORK AROUND

Name: bsC130419			Date: 06/11/2001


Nome
======================================================================
                                     
2004-10-01
EVALUATION

Name: dsR10078			Date: 06/21/2001


Pure AWT text components are based on the native window objects:
XmText and XmTextField widgets on X11, EDIT controls on Win32. All of
them clear the current selection on left mouse button press. When the
left mouse button is pressed we cannot predict whether the drag
gesture will be eventually recognized or not, so we have to follow the
default behavior and clear the current selection.

The desired behavior can be implemented for Swing text components with
enabled drag operation.

======================================================================

The reason that this occurs in Swing is that we use the caret to show the insert location. Ideally, we should not use the caret and use another means to show this location. By doing this we can avoid changing the selection. A similar change should be made for other components that use selection to show the insert location. I am changing the description and synopsis to reflect the source of the problem.
###@###.### 2001-11-13

See also 5077753. The behavior we decide on should likely be customized to act like the associated native platform for each L&F.
###@###.### 2004-07-23

A fix for this bug has been made! JTextComponent, JList, JTable and JTree now all have a new setDropMode(DropMode) method. This method controls how the components track and indicate their drop location. The new drop modes and the components that support them are:

USE_SELECTION     - JTextComponent, JList, JTable, JTree
ON                - JList, JTable, JTree
INSERT            - JTextComponent, JList, JTable, JTree
INSERT_ROWS       - JTable
INSERT_COLS       - JTable
ON_OR_INSERT      - JList, JTable, JTree
ON_OR_INSERT_ROWS - JTable
ON_OR_INSERT_COLS - JTable

The default drop mode for all components will be USE_SELECTION (which uses the selection to track the drop location), for backward compatibility. However, the new drop modes offer better options for tracking and indicating the drop location, without affecting the component's selection.

Each of these components will also have a new getDropLocation() method which will return a subclass of TransferHandler.DropLocation, customized to indicate the drop location as it makes sense for that component type. This getDropLocation() method is intended for use by UI code that renders the drop location. Additionally, the DropLocation will be passed to canImport, shouldIndicateAnyway, and importData of TransferHandler so that the behavior can be customized based on drop location.
###@###.### 2005-06-01 17:30:40 GMT
                                     
2005-06-01



Hardware and Software, Engineered to Work Together