Multiple Selection in JTree, Drag & Drop

Hi everybody,
I was wondering if anyone knows how to implement Multiple Selection Drag and Drop in a JTree. I know that there used to be a bug in jdk 1.3 that would allow it, but I suspect 1.4 fixed that. I've implemented Single-selection just fine, but I'm trying do Multiple selection by drawing a selection rectangle and selecting whatever nodes are contained within that rectangle. So far I've implemented it by adding a MouseListener to my JTree, finding which rows are intersected by the rectangle and calling addSelectionRow() to add the TreePaths.
Is there an easier way to multiple selection now that the bug of 1.3(I hope) has been fixed?

Okay, now I've implemented the changes in the DragGestureListener, DragSourceListener and DragTargetListener in order to make Multiple Selection possible, however I want to select multiple items the same way Windows Explorer does by:
1. pressing the left-mouse button & dragging a "selection" rectangle which selects all the nodes contained within that rectangle.
2. then drag and drop is accomplished by pressing one of the selected nodes and dragging it (along with it's other selected siblings) to the destination.
In order to accomplish this I added into the Constructor of my JTree extending class this code:
public class MyTree extends JTree {
private static int x1, y1, x2, y2;
public MyTree(DefaultMutableTreeNode rootNode){
// Other Constructor stuff...
this.addMouseMotionListener( new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {  
x2 = e.getX();
y2 = e.getY();
repaint();
public void mouseMoved(MouseEvent e){     }
this.addMouseListener(new MouseAdapter(){
boolean dontRelease = false;
public void mousePressed( MouseEvent e){
x1 = e.getX();
y1 = e.getY();
int[] rows = getSelectionRows();
boolean dropSel = true;
if (rows != null){
for (int i = 0; i < rows.length; i++){
Rectangle rect3 = getRowBounds(i);
if (rect3.contains(x1, y1)){
dropSel = false;
dontRelease = true;
if (dropSel){
for (int i =0; i < rows.length; i++)
removeSelectionRow(i);
public void mouseReleased( MouseEvent e){
x2 = e.getX();
y2 = e.getY();
repaint();
if (dontRelease == false) {
Rectangle rect2 = new Rectangle(Math.min(x1, x2),
Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
int rowCount = getRowCount();
for (int i = 1; i < rowCount; i++) {
Rectangle rect3 = getRowBounds(i);
if ((rect2.contains(rect3)) || (rect2.intersects(rect3))){
addSelectionRow(i);
dontRelease = false;
repaint();
The idea was that for every press of the mouse the 1st set of x,y coords. are taken to be the starting corner of the "selection" rectangle, and every point passed over while dragging would be the ending corner of the rectangle (so that in paintComponents, you could actually draw the rectangle).
Once the mouse is released it will check to see if the selection rectangle had contained or intersected any of the rows (basically I find how many rows are being shown in the tree and go through each one to see if there is intersection/containment). If a row is contained it becomes selected.
The remaining code in MousePressed is used if node(s) were previously selected it goes through and checks to see if this mouse press is at the location of one of the previous selected nodes - if it is then you can drag that node along with all of its siblings to their destination. However if your mouse press is not on one of the selected nodes - all the nodes should be deselected (like in explorer if you press away from your selection, you lose it). If you select and begin to drag your selection dontRelease should not allow the creation of another "selection" rectangle to occur during the drag-n-drop process.
-That's how I thought this code should work. Unfortunately as it does most of these things it does not correctly implement rule #2 of Windows Explorer (2. only by dragging one of the selected nodes can you drag them, otherwise you lose them)...currently as long as something is selected you can do a mouse press and drag from another location and as long as that location does not contain a node (like it is a blank area in the JTree), you can drag everything to the destination from when you start dragging.
I looked around and saw that perhaps it is due to the BasicTreeUI interferring with it's own MouseInputHandler() so I wrote MyTreeUI that extends BasicTreeUI, basically changing only the MouseInputHandler to contain the functions above, and I blocked /**/ those functions from my MyTree Constructor.
Then in my main class (the one of instantiate my MyTree and my DefaultMutableTreeNodes), I wrote:
try
String myTreeUI = "MyTreeUI";
UIManager.put( "MyTreeUI", myTreeUI );
UIManager.put( myTreeUI,
Class.forName( myTreeUI ) );
} catch( ClassNotFoundException cnfe ) {
System.err.println( "My Tree UI class not found" );
System.err.println( cnfe );
...thinking that that would be all I needed in order to set MyTreeUI as the JTree's UI, LooknFeel, etc. and although I did not get that ClassNotFoundException when running the program, it did not have any of the functionality that I had written ( I even wrote a System.out.println() in my MousePressed() function in MyTreeUI so that it would let me know that it is working and it never appeared). It was as if the MyTreeUI was not loaded or attached to the JTree. I also called:
System.out.println("this is UI: " + jTree1.getUIClassID() );
to see which UI my MyTree instantiate was using and it would printout TreeUI, not MyTreeUI. So I'm wondering what it is I'm doing wrong, I think I am very close to having this thing working but I want to know if anybody here would be able to let me know what I'm doing wrong or what would be the best way to go about implementing this Windows Explorer Multiple Selection JTree.
Sorry for the long-winded explanation,
-Meddev24.

Similar Messages

  • Multiple Selection on JTree without holding down [CTRL] or [SHIFT]

    I need an example about how make multiple selection on JTree without holding down [CTRL] or [SHIFT].
    my JTree contains JCheckBox in any nodes, but I can't select two or more checkBox in time without holding down [CRTL] or [SHIFT].
    thanks for help.
    Jose A.

    I did this a few years ago so my newbiness is going to show through a bit, but I'm too lazy to update it.import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    import java.util.*;
    public class Test3 extends JFrame {
      JTree jt = new JTree();
      MultiTreeSelectionModel mtsm = new MultiTreeSelectionModel(jt);
      JCheckBox multiCheck = new JCheckBox("Multi"),
          branchCheck = new JCheckBox("Branch");
      public Test3() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel content = (JPanel)getContentPane();
        multiCheck.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mtsm.setMultiSelect(multiCheck.isSelected());
        branchCheck.setText("Branch");
        branchCheck.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
                mtsm.setBranchSelect(branchCheck.isSelected());
        JPanel jp = new JPanel();
        jp.add(multiCheck);
        jp.add(branchCheck);
        content.add(jp, BorderLayout.NORTH);
        ActionListener specialKeyListener =
            new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    MultiTreeSelectionModel.keyModifiers = evt.getModifiers();
        KeyStroke keyStroke;
        for (int i = 0; i < keys.length; i++) {
            keyStroke = KeyStroke.getKeyStroke(keys[0], 0, true);
    content.registerKeyboardAction(specialKeyListener, keyStroke,
    JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    keyStroke = KeyStroke.getKeyStroke(keys[i][0], keys[i][1], false);
    content.registerKeyboardAction(specialKeyListener, keyStroke,
    JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    jt.setSelectionModel(mtsm);
    content.add(new JScrollPane(jt), BorderLayout.CENTER);
    setSize(300, 300);
    setVisible(true);
    public static void main(String[] args) { new Test3(); }
    private static int[][] keys = {{KeyEvent.VK_CONTROL, ActionEvent.CTRL_MASK},
    {KeyEvent.VK_SHIFT, ActionEvent.SHIFT_MASK},
    {KeyEvent.VK_ALT, ActionEvent.ALT_MASK}};
    class MultiTreeSelectionModel extends DefaultTreeSelectionModel {
    static int keyModifiers;
    private boolean branchSelect, multiSelect;
    private JTree tree;
    private TreePath[] savePaths;
    MultiTreeSelectionModel(JTree Tree) {
    tree = Tree;
    setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
    private boolean isSelected(TreePath Path) {
    return tree.isPathSelected(Path) && (keyModifiers & KeyEvent.SHIFT_MASK) == 0;
    private boolean branchSelect() {
    return branchSelect || ((keyModifiers & KeyEvent.ALT_MASK) != 0);
    public void addSelectionPaths(TreePath[] paths) {
    if (branchSelect()) paths = getAllPaths(paths);
    super.addSelectionPaths(paths);
    public void removeSelectionPaths(TreePath[] paths) {
    if (branchSelect()) paths = getAllPaths(paths);
    super.removeSelectionPaths(paths);
    public void setSelectionPaths(TreePath[] paths) {
    if (branchSelect()) {
    paths = getAllPaths(paths);
    if (paths != null && paths.length > 0 && isSelected(paths[0])) {
    super.removeSelectionPaths(paths);
    } else if (multiSelect) super.addSelectionPaths(paths);
    else super.setSelectionPaths(paths);
    protected TreePath[] getAllPaths(TreePath[] paths) {
    if (paths == null || paths.length == 0) {
    return paths;
    Vector vector = new Vector();
    DefaultMutableTreeNode treeNode, thisNode;
    for (int i = 0; i < paths.length; i++) {
    if (paths[i] != null) {
    thisNode = (DefaultMutableTreeNode) paths[i].getLastPathComponent();
    Enumeration enumeration = thisNode.preorderEnumeration();
    while (enumeration.hasMoreElements()) {
    // add all descendants to vector
    treeNode = (DefaultMutableTreeNode) enumeration.nextElement();
    TreePath treePath = new TreePath(treeNode.getPath());
    vector.add(treePath);
    int i = vector.size();
    TreePath[] allpaths = new TreePath[i];
    for (int j = 0; j < i; j++) {
    allpaths[j] = (TreePath) vector.elementAt(j);
    return allpaths;
    protected void setMultiSelect(boolean b) { multiSelect = b; }
    protected boolean isMultiSelect() { return multiSelect; }
    protected void setBranchSelect(boolean b) { branchSelect = b; }
    protected boolean isBranchSelect() { return branchSelect; }
    protected void savePaths(TreePath Path) {
    TreePath[] tmpPaths = getSelectionPaths();
    if (tmpPaths == null) {
    savePaths = null;
    } else {
    int cnt = 0;
    for (int i = 0; i < tmpPaths.length; i++) {
    if (tmpPaths[i].isDescendant(Path)) {
    cnt++;
    savePaths = new TreePath[cnt];
    cnt = 0;
    for (int i = 0; i < tmpPaths.length; i++) {
    if (tmpPaths[i].equals(Path) || tmpPaths[i].isDescendant(Path)) {
    savePaths[cnt++] = tmpPaths[i];
    protected void restorePaths() {
    if (savePaths != null) {
    final DefaultTreeSelectionModel foo = this;
    SwingUtilities.invokeLater(
    new Runnable() {
    public void run() {
    foo.setSelectionPaths(savePaths);

  • Ghost image for multiple selection in JTree while drag and drop.

    I am unable to create a Ghost image for drag and drop with in the JTree for multiple selection, i got some examples but all are for single selection ,
    Idea of creating buffered image is good , but unable to create it for multiple selection , tried a lot but got weird results.... can any body give me any clue about this , if got any example that will be fantastic.
    Thanks & Regards
    Sandeep Mandori

    sandeep_mandori wrote:
    I am unable to create a Ghost image for drag and drop with in the JTree for multiple selection, i got some examples but all are for single selection ,
    Idea of creating buffered image is good , but unable to create it for multiple selection , tried a lot but got weird results.... can any body give me any clue about this , if got any example that will be fantastic.
    Thanks & Regards
    Sandeep MandoriTry this:
        private TreePath[] dragPath;
        private BufferedImage[] image;
        private void createDragImage(JTree tree) {
            if (dragPath != null) {
                try {
                    image = new BufferedImage[dragPath.length];
                    for (int i = 0; i < dragPath.length; i++) {
                        Rectangle pathBounds = tree.getPathBounds(dragPath);
    TreeCellRenderer r = tree.getCellRenderer();
    DefaultTreeModel m = (DefaultTreeModel)tree.getModel();
    boolean nIsLeaf = m.isLeaf(dragPath[i].getLastPathComponent());
    MutableTreeNode draggedNode = (MutableTreeNode) dragPath[i].getLastPathComponent();
    JComponent lbl = (JComponent)r.getTreeCellRendererComponent(tree, draggedNode, false ,
    tree.isExpanded(dragPath[i]),nIsLeaf, 0,false);
    lbl.setBounds(pathBounds);
    BufferedImage img = new BufferedImage(lbl.getWidth(), lbl.getHeight(),
    BufferedImage.TYPE_INT_ARGB_PRE);
    Graphics2D graphics = img.createGraphics();
    graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
    lbl.setOpaque(false);
    lbl.paint(graphics);
    graphics.dispose();
    image[i] = img;
    } catch (RuntimeException re) {}

  • Multiple select options in 1 drop down box?

    Hi,
    I have created a form that works perfectly except for the fact that I need to provide multiple select options in the 1 drop down box; for example, I'm asking what product the customer is interested in and his answer could be multiple items such as Soap, Sanitizer, Hand Towels, Face Cloths etc...
    At the moment, the customer can only select 1 item not multiple.
    Is this possible?
    Thanks in advance for the help!

    Hi,
    It is not possible to allow the user to select multiple items in a dropdown list.
    You could use a list box, which does allow multiple selections.
    Good luck,
    Niall
    Assure Dynamics

  • JTree Drag & Drop question.  DragSourceDragEvent vs DropTargetDragEvent

    I'm implementing Drag and Drop within a JTree.
    I need to get the TreeNode as the user drags over it. This method works for a DropTargetDragEvent:
    private TreeNode getNodeForEvent(DropTargetDragEvent dtde)
                  Point p = dtde.getLocation();
                  DropTargetContext dsc = dtde.getDropTargetContext();
                  JTree tree = (JTree)dsc.getComponent();
                  TreePath path = tree.getClosestPathForLocation(p.x, p.y);
                  System.out.println("DropTargetDragEvent: Closet path for tree locaiton is " + path);
                  return (TreeNode)path.getLastPathComponent();
            } But this method for DragSourceDragEvent returns a node much farther down on the JTree than where the user is dragging.
    private TreeNode getNodeForEvent(DragSourceDragEvent dsde)
             Point p = dsde.getLocation();
             DragSourceContext dsc = dsde.getDragSourceContext();
             JTree tree = (JTree)dsc.getComponent();
             TreePath path = tree.getClosestPathForLocation(p.x, p.y);
             System.out.println("DragSourceDragEvent: Closet path for tree locaiton is " + path);
             return (TreeNode)path.getLastPathComponent();
       } Am I missing something? The first method I found on this site. The 2nd method I modified since I need the node based on a DragSourceDragEvent because that's where I can set a custom cursor based on the node type.
    Has anyone run into this before?
    Thanks

    I've figured out why this is happening but am not sure how to fix it.
    For DropTargetDragEvent getLocation() returns the cursors position within the component.
    For DragSouceDragEvent getLocation returns the cursors position on the screen.
    Sortof makes sense but I don't know how to get a position over a component from the position on the screen.

  • Multiple selection in JTree. Some Help!

    hi again! i have a doubt. how can i avoid to select two nodes, if they haven't got the same parent?i want not to select the second item if it has not got the same parent than the first selected one.
    is there anyone who can help me? thanks in advance...

    MathiasVersichele, welcome to the forum. Please don't post in threads that are long dead. When you have a question, start your own topic. Feel free to provide a link to an old post that may be relevant to your problem.
    I'm locking this thread now.
    db

  • Issue with Drag/Drop of multiple rows from ListView

    I am working on a sample application with 2 list views i.e. players and team, and implement drop and drop such that players can be dropped from one list view to the other. Everything is working as expected when there is single selection model is enabled on the source list view. However, if I enabled Multiple selection model and drag 2 or more rows from source list view to target list view, seeing the following exception after the drop is completed.
    Exception:
    java.lang.IllegalArgumentException: Only serializable objects or ByteBuffer can be used as data with data format [subListPlayers]
      at com.sun.javafx.tk.quantum.QuantumClipboard.putContent(QuantumClipboard.java:513)
      at javafx.scene.input.Clipboard.setContent(Clipboard.java:230)
    1) What should be the DataFormat used in order to be able to drag and drop multiple rows? Looks like we do not have for Object type, so I have created the following one which does not solve the problem.
       private DataFormat dataFormat = new DataFormat("subListPlayers");
    2) I have made changes to support serialization on the data object which also does not seem to solve the issue. Tried by implementing Serializable interface as well as by implementing Externalize interface.
    Can someone please guide if there is an easy way to implement this behavior?
    Code:
    public class Player
       private String name;
       public Player(String name)
          this.name = name;
       public String getName()
          return name;
       public void setName(String name)
          this.name = name;
       @Override
       public boolean equals(Object o)
          if (this == o) return true;
          if (o == null || getClass() != o.getClass()) return false;
          Player player = (Player) o;
          if (name != null ? !name.equals(player.name) : player.name != null) return false;
          return true;
       @Override
       public int hashCode()
          return name != null ? name.hashCode() : 0;
    public class JavaFXDnDApplication extends Application
       private static final ListView<Player> playersListView = new ListView<Player>();
       private static final ObservableList<Player> playersList = FXCollections.observableArrayList();
       private static final ListView<Player> teamListView = new ListView<Player>();
       private static final GridPane rootPane = new GridPane();
       private DataFormat dataFormat = new DataFormat("subListPlayers");
       public static void main(String[] args)
          launch(args);
       @Override
       public void start(Stage primaryStage)
          primaryStage.setTitle("Drag and Drop Application");
          initializeComponents();
          initializeListeners();
          buildGUI();
          populateData();
          primaryStage.setScene(new Scene(rootPane, 400, 325));
          primaryStage.show();
       private void initializeListeners()
          playersListView.setOnDragDetected(new EventHandler<MouseEvent>()
             @Override
             public void handle(MouseEvent event)
                System.out.println("setOnDragDetected");
                Dragboard dragBoard = playersListView.startDragAndDrop(TransferMode.MOVE);
                ClipboardContent content = new ClipboardContent();
    //            content.putString(playersListView.getSelectionModel().getSelectedItem().getName());
                content.put(dataFormat, playersListView.getSelectionModel().getSelectedItems());
                dragBoard.setContent(content);
          teamListView.setOnDragOver(new EventHandler<DragEvent>()
             @Override
             public void handle(DragEvent dragEvent)
                dragEvent.acceptTransferModes(TransferMode.MOVE);
          teamListView.setOnDragDropped(new EventHandler<DragEvent>()
             @Override
             public void handle(DragEvent dragEvent)
    //            String player = dragEvent.getDragboard().getString();
    //            ObservableList<Player> player = (ObservableList<Player>) dragEvent.getDragboard().getContent(dataFormat);
                String player = dragEvent.getDragboard().getString();
                teamListView.getItems().addAll(new Player(player));
                playersList.remove(new Player(player));
                dragEvent.setDropCompleted(true);
       private void buildGUI()
    //      rootPane.setGridLinesVisible(true);
          rootPane.setPadding(new Insets(10));
          rootPane.setPrefHeight(30);
          rootPane.setPrefWidth(100);
          rootPane.setVgap(20);
          rootPane.setHgap(20);
          rootPane.add(playersListView, 0, 0);
          rootPane.add(teamListView, 1, 0);
       private void populateData()
          playersList.addAll(
                new Player("Adam"), new Player("Alex"), new Player("Alfred"), new Player("Albert"),
                new Player("Brenda"), new Player("Connie"), new Player("Derek"), new Player("Donny"),
                new Player("Lynne"), new Player("Myrtle"), new Player("Rose"), new Player("Rudolph"),
                new Player("Tony"), new Player("Trudy"), new Player("Williams"), new Player("Zach")
          playersListView.setItems(playersList);
       private void initializeComponents()
          playersListView.setPrefSize(250, 290);
          playersListView.setEditable(true);
          playersListView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
          playersListView.setCellFactory(new Callback<ListView<Player>, ListCell<Player>>()
             @Override
             public ListCell<Player> call(ListView<Player> playerListView)
                return new ListCell<Player>()
                   @Override
                   protected void updateItem(Player player, boolean b)
                      super.updateItem(player, b);
                      if (player != null)
                         setText(player.getName());
          teamListView.setPrefSize(250, 290);
          teamListView.setEditable(true);
          teamListView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
          teamListView.setCellFactory(new Callback<ListView<Player>, ListCell<Player>>()
             @Override
             public ListCell<Player> call(ListView<Player> playerListView)
                return new ListCell<Player>()
                   @Override
                   protected void updateItem(Player player, boolean b)
                      super.updateItem(player, b);
                      if (player != null)
                         setText(player.getName());

    Yeah, this is a pain. I filed https://javafx-jira.kenai.com/browse/RT-29082 a while back. Go ahead and vote for it if you are inclined...
    I think the issue in your case is that the observable list provided by MultipleSelectionModel.getSelectedItems() is not Serializable. So even if you make your Player class Serializable, the list itself isn't. The first thing I would try, I think, is to make Player implement Serializable and then pass in an ArrayList instead of the observable list. So you can do
    content.put(dataFormat, new ArrayList<Player>(playersListView.getSelectionModel().getSelectedItems()));
    and
    List<Player> player = (List<Player>) dragEvent.getDragboard().getContent(dataFormat);
    teamListView.getItems().addAll(player);
    If that doesn't work, a workaround is just to store the "dragged list" in a property:
    final ListProperty<Player> draggedPlayers = new SimpleListProperty<Player>();
    // Drag detected handler:
    content.putString("players");
    draggedPlayers.set(playersListView.getSelectionMode().getSelectedItems());
    // Drag dropped handler:
    if (dragboard.hasString() && dragboard.getString().equals("players")) {
         teamListView.getItems().addAll(draggedPlayers.get());
         draggedPlayers.set(null);

  • Perform drag&drop in Jtree without even selecting a node once?

    Hi All,
    Is it possible to perform drag and Drop action on tree nodes even when the Jtree is not active.
    That is, say a jtree is not active and i directly want to drag a node inside it without even selecting it once?
    Thanks alot in Advance.

    You should google for "jtree drag and drop". I remember seeing a very nice tutorial on codeproject.
    If your run into any specific issue let me know.

  • JTree Drag and Drop (Multi Nodes)

    Hi All!
    I have been searching the forums for a few hours over the last few days and have found some nice examples and explanations on how to implement drag and drop for a jtree.
    However, I would love to know how this is accomplished when selecting multiple nodes.
    I want to be able to see all the selected nodes being dragged...
    Anyone implemented anything of the sort... or even just knows how to do this?
    Thanks in advance!!
    Aaron.

    When you drag get the [x,y] mouse position and use the JTree method:
    getRowForLocation(x, y) for node you at the also for the parent node location of the child node.
    Once the childY is less than childParentY, you stop the drag.
    Hope that helps?

  • Drag & Drop multiple files

    Does anyone know if there's a hack or a fix for this?
    When you drag & drop multiple files (into any program, as far as I know -- if it's a software-specific thing please correct me), they open in a completely random order. This is obnoxious -- and downright frustrating when you're copying from them and closing them... and the app crashes. Because I now have no easy way to tell which ones I've already copied from.
    Thoughts? Ideas? Rumors of a fix? I don't recall this being a problem in OS9 -- what, five updates ago? Seems like it should be a simple thing. Now, it would be truly elegant if they would open in the order that the window was sorted by... but I'd settle for ANY kind of order.
    Thanks all!

    Looks like the bug is even more complex than I had known. I usually select the items and double click to open in Preview. As long as the window is in column view they open in order. Just tried dragging to the Dock and....one time they opened wrong, but half a dozen other trials all opened correctly. A little more experimenting, and it seems to me that if you first open a batch from list view they open incorrectly, if you then put into Column view and try to open the same batch again, the will still open incorrectly. Seems like there may be a cache effect of some sort going on.
    Photoshop is likely a whole 'nother kettle of fish. I know that in order for things to open at all when you double click or drop on the Dock icon, you have to have the following:
    "/Library/ScriptingAdditions/Adobe Unit Types"
    What that does with information that gets passed to it is anybody's guess. Personally, if I'm going to batch open Photoshop files I do it from the Photoshop file browser.
    Francine
    Francine
    Schwieder

  • File Click & Select vs Click Pause Drag & Drop

    Please, someone tell me there is a way -and how- to disable the following behavior.
    Summary:
    Expected/Desired Behavior: I select files, click one that is highlighted, start dragging, the list of selected files is dragged along with cursor to be dropped in a new window.
    Actual Behavior: I select files, click one that is highlighted, start dragging, a new selection is started, previous selected files are deselected, and nothing is dragged to be dropped elsewhere.
    Details/Gripe:
    If I highlight a series of files in finder - which I usually do by clicking the first one, going to the last, and while holding shift clicking the last one to select all in the middle; or by holding option and selecting multiple files that are not in order - I expect the behavior to be that when I click and start to drag from a highlighted file for that file to MOVE/DRAG with the cursor to a new location.
    However, what is happening, is even if I select multiple files in the same folder but are not consecutively listed, when I click and start to drag the selection area restarts from my cursor and a "quick selection" is made as the cursor drags along -- subsequently UNSELECTING everything I had selected earlier.
    This is a real problem for me. I consistently do this and it annoys me. The only "work around" that I have found is to click a file, wait two seconds, and then start dragging. However, this is completely unacceptable to me - it wastes time and more importantly I do not remember to do it nine times out of ten.
    Maybe there is a key I can hold down while dragging to make it drag? Or a system config somewhere? I have tried everything I can think of and nothing cures this issue for me.
    Other:
    In addition to that. Is there any way to enable shortcuts for moving files - that is, so I can highlight files, hit COMMAND+X [or any other key combination] for cut, and paste them in a new location, or copy them to a new location? I realize this is a Windows behavior, but I really do prefer to use hot combinations.
    Thanks!
    Message was edited by: Maztec
    Message was edited by: Maztec

    K T:
    Thank you for the quick response. Unfortunately, that does not solve my problem.
    If finder is in list mode, and I hold down command, select several files quickly, then click and start to drag on the last to move them all - it changes selection [albeit, it inverses anything already selected], it does not start dragging.
    That said, if they were preselected and I have newly hit command and start to drag, about 90% of the time it drags and lets me move the files, the remainder of the time it starts selecting other files ... which is not the behavior I want.
    Is there any way I can disable the click+drag w/o hot key = select? I would be happy to have it do this when I hold down shift and click+drag, but as the default behavior across all commands it really does not work well for me.

  • How do I import or move multiple selected photos to an existing album in iPhoto 9.6? In previous versions I could select and drag multiple photos into an album. Now I can only move one photo at a time. Help!

    How do I import or move multiple selected photos to an existing album in iPhoto 9.6? In previous versions I could select and drag multiple photos into an album. Now I can only move one photo at a time. Help!

    Try this general troubleshooting procedure:
    1 - delete the iPhoto preference file, com.apple.iPhoto.plist, that resides in your
         User/Home/Library/ Preferences folder.
    2 - delete the contents the following folder: User/Library/Containers/com.apple.iPhoto
    3 - reboot, launch iPhoto and try again.
    NOTE: For Mavericks and Yosemite,  go to your Home folder and use the View ➙ Show View Options menu to bring the this window:
    where you can check the Show Library Folder checkbox.

  • How to outline selected cells during drag and drop in the jtable

    Hi,
    I have spent a lot of time to find out how to outline selected cells during drag in the jtable, but I did not find the answer.
    Can anybody give me a tip, where to read more about this problem or even better, give an example...
    I have the following situation:
    1.Table has 10 rows and 10 columns
    2.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION) and setCellSelectionEnabled(true)
    3.user select 5 cells in 4th row (for example cell45,cell46,cell47,cell48 and cell49)
    4.user starts dragging. During dragging an outline should be drawn. Outline should be a rectangular with width of 5 cells and height of one cell. Outline should move according to the mouse position.
    5.rectangular disappears when dropped
    Regards,
    Primoz

    In "createTransferable" you can create a drag image
    which you can paint in "dragOver" and clear in "drop" method of DropTarget :
    package dnd;
    * DragDropJTableCellContents.java
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.datatransfer.*;
    import java.awt.dnd.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    public class DragDropJTableCellContents extends JFrame {
        public DragDropJTableCellContents() {
            setTitle("Drag and Drop JTable");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            getContentPane().add(createTable("JTable"), BorderLayout.CENTER);
            setSize(400, 300);
            setLocationRelativeTo(null);
        private JPanel createTable(String tableId) {
            DefaultTableModel model = new DefaultTableModel();
            for (int i = 0; i < 10; i++) {
                model.addColumn("Column "+i);
            for (int i = 0; i < 10; i++) {
                String[] rowData = new String[10];
                for (int j = 0; j < 10; j++) {
                    rowData[j] = tableId + " " + i + j;
                model.addRow(rowData);
            JTable table = new JTable(model);
            table.getTableHeader().setReorderingAllowed(false);
            table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
            table.setCellSelectionEnabled(true);
            JScrollPane scrollPane = new JScrollPane(table);
            table.setDragEnabled(true);
            TableTransferHandler th = new TableTransferHandler();
            table.setTransferHandler(th);
            table.setDropTarget(new TableDropTarget(th));
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            JPanel panel = new JPanel(new BorderLayout());
            panel.add(scrollPane);
            panel.setBorder(BorderFactory.createTitledBorder(tableId));
            return panel;
        public static void main(String[] args) {
            new DragDropJTableCellContents().setVisible(true);
        abstract class StringTransferHandler extends TransferHandler {
            public int dropAction;
            protected abstract String exportString(JComponent c);
            protected abstract void importString(JComponent c, String str);
            @Override
            protected Transferable createTransferable(JComponent c) {
                return new StringSelection(exportString(c));
            @Override
            public int getSourceActions(JComponent c) {
                return COPY;
            @Override
            public boolean importData(JComponent c, Transferable t) {
                if (canImport(c, t.getTransferDataFlavors())) {
                    try {
                        String str = (String) t.getTransferData(DataFlavor.stringFlavor);
                        importString(c, str);
                        return true;
                    } catch (UnsupportedFlavorException ufe) {
                    } catch (IOException ioe) {
                return false;
            @Override
            public boolean canImport(JComponent c, DataFlavor[] flavors) {
                for (int ndx = 0; ndx < flavors.length; ndx++) {
                    if (DataFlavor.stringFlavor.equals(flavors[ndx])) {
                        return true;
                return false;
        class TableTransferHandler extends StringTransferHandler {
            private int dragRow;
            private int[] dragColumns;
            private BufferedImage[] image;
            private int row;
            private int[] columns;
            public JTable target;
            @Override
            protected Transferable createTransferable(JComponent c) {
                JTable table = (JTable) c;
                dragRow = table.getSelectedRow();
                dragColumns = table.getSelectedColumns();
                createDragImage(table);
                return new StringSelection(exportString(c));
            protected String exportString(JComponent c) {
                JTable table = (JTable) c;
                row = table.getSelectedRow();
                columns = table.getSelectedColumns();
                StringBuffer buff = new StringBuffer();
                for (int j = 0; j < columns.length; j++) {
                    Object val = table.getValueAt(row, columns[j]);
                    buff.append(val == null ? "" : val.toString());
                    if (j != columns.length - 1) {
                        buff.append(",");
                return buff.toString();
            protected void importString(JComponent c, String str) {
                target = (JTable) c;
                DefaultTableModel model = (DefaultTableModel) target.getModel();
                String[] values = str.split("\n");
                int colCount = target.getSelectedColumn();
                int max = target.getColumnCount();
                for (int ndx = 0; ndx < values.length; ndx++) {
                    String[] data = values[ndx].split(",");
                    for (int i = 0; i < data.length; i++) {
                        String string = data;
    if(colCount < max){
    model.setValueAt(string, target.getSelectedRow(), colCount);
    colCount++;
    public BufferedImage[] getDragImage() {
    return image;
    private void createDragImage(JTable table) {
    if (dragColumns != null) {
    try {
    image = new BufferedImage[dragColumns.length];
    for (int i = 0; i < dragColumns.length; i++) {
    Rectangle cellBounds = table.getCellRect(dragRow, i, true);
    TableCellRenderer r = table.getCellRenderer(dragRow, i);
    DefaultTableModel m = (DefaultTableModel) table.getModel();
    JComponent lbl = (JComponent) r.getTableCellRendererComponent(table,
    table.getValueAt(dragRow, dragColumns[i]), false, false, dragRow, i);
    lbl.setBounds(cellBounds);
    BufferedImage img = new BufferedImage(lbl.getWidth(), lbl.getHeight(),
    BufferedImage.TYPE_INT_ARGB_PRE);
    Graphics2D graphics = img.createGraphics();
    graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
    lbl.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
    lbl.paint(graphics);
    graphics.dispose();
    image[i] = img;
    } catch (RuntimeException re) {
    class TableDropTarget extends DropTarget {
    private Insets autoscrollInsets = new Insets(20, 20, 20, 20);
    private Rectangle rect2D = new Rectangle();
    private TableTransferHandler handler;
    public TableDropTarget(TableTransferHandler h) {
    super();
    this.handler = h;
    @Override
    public void dragOver(DropTargetDragEvent dtde) {
    handler.dropAction = dtde.getDropAction();
    JTable table = (JTable) dtde.getDropTargetContext().getComponent();
    Point location = dtde.getLocation();
    int row = table.rowAtPoint(location);
    int column = table.columnAtPoint(location);
    table.changeSelection(row, column, false, false);
    paintImage(table, location);
    autoscroll(table, location);
    super.dragOver(dtde);
    public void dragExit(DropTargetDragEvent dtde) {
    clearImage((JTable) dtde.getDropTargetContext().getComponent());
    super.dragExit(dtde);
    @Override
    public void drop(DropTargetDropEvent dtde) {
    Transferable data = dtde.getTransferable();
    JTable table = (JTable) dtde.getDropTargetContext().getComponent();
    clearImage(table);
    handler.importData(table, data);
    super.drop(dtde);
    private final void paintImage(JTable table, Point location) {
    Point pt = new Point(location);
    BufferedImage[] image = handler.getDragImage();
    if (image != null) {
    table.paintImmediately(rect2D.getBounds());
    rect2D.setLocation(pt.x - 15, pt.y - 15);
    int wRect2D = 0;
    int hRect2D = 0;
    for (int i = 0; i < image.length; i++) {
    table.getGraphics().drawImage(image[i], pt.x - 15, pt.y - 15, table);
    pt.x += image[i].getWidth();
    if (hRect2D < image[i].getHeight()) {
    hRect2D = image[i].getHeight();
    wRect2D += image[i].getWidth();
    rect2D.setSize(wRect2D, hRect2D);
    private final void clearImage(JTable table) {
    table.paintImmediately(rect2D.getBounds());
    private Insets getAutoscrollInsets() {
    return autoscrollInsets;
    private void autoscroll(JTable table, Point cursorLocation) {
    Insets insets = getAutoscrollInsets();
    Rectangle outer = table.getVisibleRect();
    Rectangle inner = new Rectangle(outer.x + insets.left,
    outer.y + insets.top,
    outer.width - (insets.left + insets.right),
    outer.height - (insets.top + insets.bottom));
    if (!inner.contains(cursorLocation)) {
    Rectangle scrollRect = new Rectangle(cursorLocation.x - insets.left,
    cursorLocation.y - insets.top,
    insets.left + insets.right,
    insets.top + insets.bottom);
    table.scrollRectToVisible(scrollRect);
    Edited by: Andre_Uhres on Nov 18, 2007 10:03 PM

  • How to allow multiple selection of nodes in a JTree

    How to allow multiple selection of nodes in a JTree ?
    Thanks
    S.Satish

    By default when you create new instance og JTree the selection model is multiple selection. And if you want to change it you use next:
    tee.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    or
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
    or
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
    Hope will help!

  • Drag&drop columns no longer works for selected columns in EA3

    Hi
    drag&drop from navigator to build select statements in EA3 uses all columns of the tabl instead of the selected ones!
    Best regards
    Joe

    It's working for me in our current dev build, if it's broken in EA3, it's since been fixed.

Maybe you are looking for

  • Remote app on iphone 5:  Why are songs gray?

    So I just got an Airport Express and the Remote app. In the app, 80% of my songs are gray and I am unable to add them to "Up next," but I can still play them when selected individually. Any ideas what's up? -G

  • Getting Portal Runtime Error while accessing one link in Portal Page.

    Hi, Can anyone tell why I am getting below error while accessing one of the portal page link: " Portal runtime error. An exception occurred while processing your request. Send the exception ID to your portal administrator. Exception ID: 01:19_27/02/0

  • JD Edwards World A9.1 Installation document

    I could not find the complete installation document of world A9.1 installation on AS/400. we found the quick installation guide and the documents on web enablement and service enablement, does this docyuments are sufficient to install A9.1. we are pl

  • Error 16: folders aren't there at all

    Hi, I'm running various adobe products off of my Windows 8 laptop, and I had to reset my computer to day one recently due to a virus. I was able to save all of my documents and the programs themselves; but now I don't have the slstore folders or anyt

  • ARD 2.2 and RealVNC 4.1.1 question

    Hello everyone, I have ARD 2.2 on my Powerbook and RealVNC 4.1.1 (Free Edition) installed on my PC desktop. I have tried several time to connect from my Laptop to the PC desktop using ARD but I couldn't, it said "Connection failed" on my laptop. Ther