Swing/DnDTable のバックアップの現在との差分(No.5)
TITLE:JTableの行をドラッグ&ドロップ
Posted by terai at 2007-04-02
JTableの行をドラッグ&ドロップ
JTableの行をドラッグ&ドロップで入れ替えます。- category: swing folder: DnDTable title: JTableの行をドラッグ&ドロップ tags: [JTable, DragAndDrop] author: aterai pubdate: 2007-04-02T16:29:09+09:00 description: JTableの行を選択し、その順序をドラッグ&ドロップで入れ替えます。 image:
概要
JTable
の行を選択し、その順序をドラッグ&ドロップで入れ替えます。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
class DnDTable extends JTable implements DragGestureListener, DragSourceListener, Transferable {
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
class DnDTable extends JTable implements DragGestureListener, Transferable {
#spanend
private static final String NAME = "test";
private static final Color lineColor = new Color(255,100,100);
private Rectangle2D targetLine = new Rectangle2D.Float();
private static final DataFlavor FLAVOR =
new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType, NAME);
private static final Color LINE_COLOR = new Color(255, 100, 100);
private final Rectangle2D targetLine = new Rectangle2D.Float();
private int draggedIndex = -1;
private int targetIndex = -1;
#spanadd
#spanend
public DnDTable(TableModel model) {
super(model);
DropTarget dropTarget = new DropTarget(this,
DnDConstants.ACTION_COPY_OR_MOVE, new CDropTargetListener(), true);
DragSource dragSource = new DragSource();
dragSource.createDefaultDragGestureRecognizer((Component)this,
DnDConstants.ACTION_COPY_OR_MOVE, (DragGestureListener)this);
//DropTarget dropTarget =
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE,
new CDropTargetListener(), true);
//DragSource dragSource = new DragSource();
new DragSource().createDefaultDragGestureRecognizer(
(Component) this, DnDConstants.ACTION_COPY_OR_MOVE,
(DragGestureListener) this);
}
public void paintComponent(Graphics g) {
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(targetIndex>=0) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(lineColor);
if (targetIndex >= 0) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(LINE_COLOR);
g2.fill(targetLine);
g2.dispose();
}
}
#spanadd
#spanend
private void initTargetLine(Point p) {
Rectangle2D testArea = new Rectangle2D.Float();
int cellHeight = getRowHeight();
int lineWidht = getWidth();
int lineWidth = getWidth();
int lineHeight = 2;
int modelSize = getRowCount();
targetIndex = -1;
for(int i=0;i<modelSize;i++) {
testArea.setRect(0, cellHeight*i-(cellHeight/2), lineWidht, cellHeight);
if(testArea.contains(p)) {
for (int i = 0; i < modelSize; i++) {
testArea.setBounds(
0, cellHeight * i - cellHeight / 2, lineWidth, cellHeight);
if (testArea.contains(p)) {
targetIndex = i;
targetLine.setRect(0, i*cellHeight, lineWidht, lineHeight);
targetLine.setBounds(0, i * cellHeight, lineWidth, lineHeight);
break;
}
}
if(targetIndex<0) {
if (targetIndex < 0) {
targetIndex = modelSize;
targetLine.setRect(0, targetIndex*cellHeight-lineHeight, lineWidht, lineHeight);
targetLine.setBounds(
0, targetIndex * cellHeight - lineHeight, lineWidth, lineHeight);
}
}
#spanadd
#spanend
// Interface: DragGestureListener
public void dragGestureRecognized(DragGestureEvent e) {
if(getSelectedRowCount()>1) return;
@Override public void dragGestureRecognized(DragGestureEvent e) {
if (getSelectedRowCount() > 1) {
return;
}
draggedIndex = rowAtPoint(e.getDragOrigin());
if(draggedIndex<0) return;
try{
e.startDrag(DragSource.DefaultMoveDrop, (Transferable)this, (DragSourceListener)this);
}catch(InvalidDnDOperationException idoe) {}
if (draggedIndex < 0) {
return;
}
try {
e.startDrag(DragSource.DefaultMoveDrop, (Transferable) this,
new TableDragSourceListener());
} catch (InvalidDnDOperationException idoe) {
idoe.printStackTrace();
}
}
// Interface: DragSourceListener
public void dragEnter(DragSourceDragEvent e) {
e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop);
}
public void dragExit(DragSourceEvent e) {
e.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop);
}
public void dragOver(DragSourceDragEvent e) {}
public void dropActionChanged(DragSourceDragEvent e) {}
public void dragDropEnd(DragSourceDropEvent e) {}
#spanadd
#spanend
// Interface: Transferable
private final DataFlavor FLAVOR
= new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType, NAME);
public Object getTransferData(DataFlavor flavor) {
@Override public Object getTransferData(DataFlavor flavor) {
return this;
}
public DataFlavor[] getTransferDataFlavors() {
DataFlavor[] f = new DataFlavor[1];
f[0] = this.FLAVOR;
return f;
#spanadd
#spanend
@Override public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {FLAVOR};
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
#spanadd
#spanend
@Override public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.getHumanPresentableName().equals(NAME);
}
class CDropTargetListener implements DropTargetListener{
// DropTargetListener interface
public void dragExit(DropTargetEvent e) {
#spanadd
#spanend
class CDropTargetListener implements DropTargetListener {
@Override public void dragExit(DropTargetEvent e) {
targetIndex = -1;
repaint();
}
public void dragEnter(DropTargetDragEvent e) {
if(isDragAcceptable(e)) {
#spanadd
#spanend
@Override public void dragEnter(DropTargetDragEvent e) {
if (isDragAcceptable(e)) {
e.acceptDrag(e.getDropAction());
}else{
} else {
e.rejectDrag();
}
}
public void dragOver(final DropTargetDragEvent e) {
if(isDragAcceptable(e)) {
#spanadd
#spanend
@Override public void dragOver(final DropTargetDragEvent e) {
if (isDragAcceptable(e)) {
e.acceptDrag(e.getDropAction());
}else{
setCursor(DragSource.DefaultMoveDrop);
} else {
e.rejectDrag();
setCursor(DragSource.DefaultMoveNoDrop);
return;
}
initTargetLine(e.getLocation());
repaint();
}
public void dropActionChanged(DropTargetDragEvent e) {
// if(isDragAcceptable(e)) e.acceptDrag(e.getDropAction());
#spanadd
#spanend
@Override public void dropActionChanged(DropTargetDragEvent e) {
// if (isDragAcceptable(e)) { e.acceptDrag(e.getDropAction()); }
// else e.rejectDrag();
}
public void drop(DropTargetDropEvent e) {
DefaultTableModel model = (DefaultTableModel)getModel();
Transferable t = e.getTransferable();
DataFlavor[] f = t.getTransferDataFlavors();
try {
if(isDropAcceptable(e)) {
Component comp = (Component) t.getTransferData(f[0]);
if(targetIndex==draggedIndex) {
setRowSelectionInterval(targetIndex,targetIndex);
}else{
int tg = (targetIndex<draggedIndex)?targetIndex:targetIndex-1;
model.moveRow(draggedIndex,draggedIndex,tg);
setRowSelectionInterval(tg,tg);
}
e.dropComplete(true);
}else{
e.dropComplete(false);
#spanadd
#spanend
@Override public void drop(DropTargetDropEvent e) {
DefaultTableModel model = (DefaultTableModel) getModel();
if (isDropAcceptable(e)) {
if (targetIndex == draggedIndex) {
setRowSelectionInterval(targetIndex, targetIndex);
} else {
int tg = targetIndex < draggedIndex ? targetIndex : targetIndex - 1;
model.moveRow(draggedIndex, draggedIndex, tg);
setRowSelectionInterval(tg, tg);
}
}catch(UnsupportedFlavorException ex) {
e.dropComplete(true);
} else {
e.dropComplete(false);
}catch(IOException ie) {
e.dropComplete(false);
}
e.dropComplete(false);
setCursor(Cursor.getDefaultCursor());
targetIndex = -1;
repaint();
}
public boolean isDragAcceptable(DropTargetDragEvent e) {
private boolean isDragAcceptable(DropTargetDragEvent e) {
DataFlavor[] f = e.getCurrentDataFlavors();
return isDataFlavorSupported(f[0]);
}
public boolean isDropAcceptable(DropTargetDropEvent e) {
private boolean isDropAcceptable(DropTargetDropEvent e) {
Transferable t = e.getTransferable();
DataFlavor[] f = t.getTransferDataFlavors();
return isDataFlavorSupported(f[0]);
}
}
}
解説
ドラッグソースとドラッグターゲットをどちらもJTableにして、行の入れ替えがドラッグ&ドロップで出来るようになっています。解説
ドラッグソースとドラッグターゲットをどちらもJTable
にして、行の入れ替えがドラッグ&ドロップで可能になっています。
このサンプルのドラッグ&ドロップの手順などは、JListの項目をドラッグ&ドロップとほとんど同一です*1。
このサンプルのドラッグ&ドロップの手順は、行の入れ替え処理などを除けばJListの項目をドラッグ&ドロップと同等です。
複数アイテムを選択しての移動には対応していません。
参考リンク
- JListの項目をドラッグ&ドロップ
- JTable自体の高さを拡張
- TransferHandlerを使ってJTableの行をドラッグ&ドロップ、並べ替え
-
Java 1.6.0
以上で複数行を選択して移動を行う場合のサンプル
-
- JTableの行を別のJTableにドラッグして移動
- JTree間でのドラッグ&ドロップによるノードの移動