jtable에서 줄을 어떻게 끌고 떨어 뜨리나요?
-
11-07-2019 - |
문제
테이블의 다른 인덱스로 행을 드래그 할 수 있도록 JTABLE을 어떻게 설정합니까? 예를 들어 5 행이 있고 4 번째 행을 2 위로 드래그하고 싶다면?
해결책
확인하십시오 끌어서 놓기 Java 튜토리얼 섹션. 이것을 구현하는 방법에 대한 몇 가지 예가 있습니다. JTable
.
다른 팁
다음은 단일 드래그 행을 재주문 할 수 있습니다.
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new TableRowTransferHandler(table));
Tablemodel은 다시 주문을 허용하기 위해 다음을 구현해야합니다.
public interface Reorderable {
public void reorder(int fromIndex, int toIndex);
}
이 TransferHandler 클래스는 드래그 앤 드롭을 처리하고 제스처가 완료되면 Tablemodel에서 Reorder ()을 호출합니다.
/**
* Handles drag & drop row reordering
*/
public class TableRowTransferHandler extends TransferHandler {
private final DataFlavor localObjectFlavor = new ActivationDataFlavor(Integer.class, "application/x-java-Integer;class=java.lang.Integer", "Integer Row Index");
private JTable table = null;
public TableRowTransferHandler(JTable table) {
this.table = table;
}
@Override
protected Transferable createTransferable(JComponent c) {
assert (c == table);
return new DataHandler(new Integer(table.getSelectedRow()), localObjectFlavor.getMimeType());
}
@Override
public boolean canImport(TransferHandler.TransferSupport info) {
boolean b = info.getComponent() == table && info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop);
return b;
}
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean importData(TransferHandler.TransferSupport info) {
JTable target = (JTable) info.getComponent();
JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation();
int index = dl.getRow();
int max = table.getModel().getRowCount();
if (index < 0 || index > max)
index = max;
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try {
Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor);
if (rowFrom != -1 && rowFrom != index) {
((Reorderable)table.getModel()).reorder(rowFrom, index);
if (index > rowFrom)
index--;
target.getSelectionModel().addSelectionInterval(index, index);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void exportDone(JComponent c, Transferable t, int act) {
if ((act == TransferHandler.MOVE) || (act == TransferHandler.NONE)) {
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}
아마도 sth. 이와 같이:
table.addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
e.consume();
JComponent c = (JComponent) e.getSource();
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag(c, e, TransferHandler.MOVE);
}
public void mouseMoved(MouseEvent e) {
}
});
레코드와 여러 행 재주문을 위해서만 :
어딘가에 사용하십시오 ....
JTable table = t_objects;
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new TableRowTransferHandler(table));
이것은 위의 답변의 주요 클래스이며 여러 행 DND의 요구와 일치하도록 수정했습니다. 내가 한 것은 첫 번째 선택 행을 사용한 다음 드롭 장소 위의 행을 계산하는 것이 었습니다. 셀렉트 항목을 제거하고 객체 목록 (행 배열 개체)에 보관합니다. 그런 다음 계산 된 행에 다시 삽입하십시오. 마지막으로 제거/드래그 된 행을 선택하여 프로세스를 완료하십시오.
public class TableRowTransferHandler extends TransferHandler {
private final DataFlavor localObjectFlavor = new DataFlavor(Integer.class, "Integer Row Index");
private JTable table = null;
public TableRowTransferHandler(JTable table) {
this.table = table;
}
@Override
protected Transferable createTransferable(JComponent c) {
assert (c == table);
return new DataHandler(new Integer(table.getSelectedRow()), localObjectFlavor.getMimeType());
}
@Override
public boolean canImport(TransferHandler.TransferSupport info) {
boolean b = info.getComponent() == table && info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop);
return b;
}
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean importData(TransferHandler.TransferSupport info) {
JTable target = (JTable) info.getComponent();
JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation();
int index = dl.getRow();
int max = table.getModel().getRowCount();
if (index < 0 || index > max) {
index = max;
}
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try {
Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor);
if (rowFrom != -1 && rowFrom != index) {
int[] rows = table.getSelectedRows();
int dist = 0;
for (int row : rows) {
if (index > row) {
dist++;
}
}
index -= dist;
//**TableUtil** is a simple class that just copy, remove and select rows.
ArrayList<Object> list = TableUtil.getSelectedList(table);
TableUtil.removeSelected(table);
ArrayList<Integer> sels = new ArrayList<Integer>();
for (Object obj : list) {
sels.add(index);
TableUtil.addRowAt(table, obj, index++);
}
TableUtil.selectMultipleRow(table, sels);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void exportDone(JComponent c, Transferable t, int act) {
if (act == TransferHandler.MOVE) {
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}
나는 Soley의 수정을 좋아하지만 그의 코드는 외부 라이브러리에 의존하며 그가 어디에서 얻었는지 확신 할 수 없으므로 TableUtil 클래스가 필요하지 않도록 다시 작성했습니다 ...
@Override
public boolean importData(TransferHandler.TransferSupport info) {
JTable target = (JTable) info.getComponent();
JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation();
int index = dl.getRow();
int max = table.getModel().getRowCount();
if (index < 0 || index > max) {
index = max;
}
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try {
Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor);
if (rowFrom != -1 && rowFrom != index) {
int[] rows = table.getSelectedRows();
int iter = 0;
for (int row : rows) {
if (index > row) {
index--;
((Reorderable) table.getModel()).reorder(row - iter, index);
}
else {
((Reorderable) table.getModel()).reorder(row, index);
}
index++;
iter++;
}
target.getSelectionModel().addSelectionInterval(index, index);
return true;
}
} catch (Exception e) {
String error = e.getMessage();
JOptionPane.showMessageDialog(null, error, "Error", JOptionPane.ERROR_MESSAGE);
}
return false;
}
제휴하지 않습니다 StackOverflow