Hi Roger, I checked out that I have to change to non-native to get my LocalManifest to be used. And for this, I wonder why the RemoteManifest doesn't have containsValue implemented. I also changed the action to MOVE but not sure what the difference is. For the column index calculation, I found out that the mouse point returned from DragBegin and Drop is different. the Drop return the ancestor's location while DragBegin returns table view location. Should be this a bug? Thanks, Brendan
Subject: Re: Use Drag and Drop in TableView Header From: [email protected] Date: Thu, 6 Dec 2012 09:42:59 -0800 To: [email protected] Hi Brendan, My guess would be that you are putting the column back in the same place that it was. I would check indexes and things in the end drop method. Without analyzing the code in detail that would be the first thing I would check. If that is not the case (the indexes are all what you expect) then I would make sure that all the proper methods are being called at the right time. After that, you will have to do some old-fashioned debugging on it. Do you have a Java debugger setup (like Eclipse or NetBeans or jswat)? On first examination it seems like most everything is correct, so it's probably something pretty simple. HTH,~Roger Whitcomb Sent from my iPhone On Dec 6, 2012, at 4:44 AM, Brendan cheng <[email protected]> wrote: Hi, I tried to implement a drag and drop function on column of table view header. I followed an example of Demo and coded as followed but nothing happened. Could you give me some advice on my code? Brendan Here is: primaryHeader.setDragSource(new DragSource() { private LocalManifest content = null; @Override public boolean beginDrag(Component component, int x, int y) { int columnIndex = primaryHeader.getTableView().getColumnAt(x); Column column = primaryHeader.getTableView() .getColumns().get(columnIndex); if (column != null) { content = new LocalManifest(); dragDropKey = column.getName(); content.putValue(dragDropKey, column); } return (content != null); } @Override public void endDrag(Component component, DropAction dropAction) { content = null; } @Override public boolean isNative() { return true; } @Override public LocalManifest getContent() { return content; } @Override public Visual getRepresentation() { // TODO Auto-generated method stub return null; } @Override public Point getOffset() { // TODO Auto-generated method stub return null; } @Override public int getSupportedDropActions() { return DropAction.COPY.getMask(); } }); primaryHeader.setDropTarget(new DropTarget() { @Override public DropAction dragEnter(Component component, Manifest dragContent, int supportedDropActions, DropAction userDropAction) { DropAction dropAction = null; if (dragContent.containsValue(dragDropKey) && DropAction.COPY.isSelected(supportedDropActions)) { dropAction = DropAction.COPY; } return dropAction; } @Override public void dragExit(Component component) { // empty block } @Override public DropAction dragMove(Component component, Manifest dragContent, int supportedDropActions, int x, int y, DropAction userDropAction) { return (dragContent.containsValue(dragDropKey) ? DropAction.COPY : null); } @Override public DropAction userDropActionChange(Component component, Manifest dragContent, int supportedDropActions, int x, int y, DropAction userDropAction) { return (dragContent.containsValue(dragDropKey) ? DropAction.COPY : null); } @Override public DropAction drop(Component component, Manifest dragContent, int supportedDropActions, int x, int y, DropAction userDropAction) { DropAction dropAction = null; int columnIndex = primaryHeader.getTableView().getColumnAt(x); if (dragContent.containsValue(dragDropKey)) { try { primaryHeader .getTableView() .getColumnSource() .getColumns() .remove((Column) dragContent .getValue(dragDropKey)); primaryHeader .getTableView() .getColumnSource() .getColumns() .insert((Column) dragContent .getValue(dragDropKey), columnIndex); dropAction = DropAction.COPY; } catch (IOException exception) { System.err.println(exception); } } dragExit(component); return dropAction; } });
