gpt4 book ai didi

Java:如何在不使用 TransferHandler 的情况下拖动 JTable 行?

转载 作者:行者123 更新时间:2023-12-02 09:30:17 25 4
gpt4 key购买 nike

在 Java 中,JTable 默认情况下不提供拖动 JTable 行以对表重新排序的功能。我在网上看到的许多答案都建议您应该使用自定义的 TransferHandler 实现来实现此行为。然而,我发现这让事情变得非常复杂,需要有一种更简单的方法来做到这一点。任何人都可以提供有关如何更有效地拖放表格行以重新排序表格的建议吗?

最佳答案

为了实现此行为,您可以使用MouseListener的组合。和一个 MouseMotionListenerDefaultTableModel提供可翻译 Point 的功能事件发生的行。使用此功能,我们可以有效地拖动表格行。下面的代码示例显示了实时拖动表格行的基本实现。请注意tabletableModel属性被故意削弱:我们不想要 MouseHandler保持对 table 的强烈引用或tableModel .

public class MouseHandler implements MouseListener, MouseMotionListener {

private Integer row = null;

private final WeakReference<JTable> table;
private final WeakReference<DefaultTableModel> tableModel;

public MouseHandler(JTable table, DefaultTableModel model) {
this.table = new WeakReference<>(table);
this.tableModel = new WeakReference<>(model);
}

@Override
public void mouseClicked(MouseEvent event) {}

@Override
public void mousePressed(MouseEvent event) {
JTable table;
if((table = this.table.get()) == null) {
return;
}
int viewRowIndex = table.rowAtPoint(event.getPoint());
row = table.convertRowIndexToModel(viewRowIndex);
}

@Override
public void mouseReleased(MouseEvent event) {
row = null;
}

@Override
public void mouseEntered(MouseEvent event) {}

@Override
public void mouseExited(MouseEvent event) {}

@Override
public void mouseDragged(MouseEvent event) {
JTable table;
DefaultTableModel tableModel;
if((table = this.table.get()) == null || (tableModel = this.tableModel.get()) == null) {
return;
}

int viewRowIndex = table.rowAtPoint(event.getPoint());
int currentRow = table.convertRowIndexToModel(viewRowIndex);

if(row == null || currentRow == row) {
return;
}

tableModel.moveRow(row, row, currentRow);
row = currentRow;
table.setRowSelectionInterval(viewRowIndex, viewRowIndex);
}

@Override
public void mouseMoved(MouseEvent event) {}

}

在我看来,这是一个比大多数使用 TransferHandler 的建议更干净、更友好的实现。 .

更新时间:2019 年 9 月 22 日 11.51(中欧夏令时间)正如 @MadProgrammer 建议的,原始示例在处理过滤/排序表时存在问题。该示例现已更新以也支持这些内容。在排序表中移动行时,移动的行将插入到下一个可见行之后的一个索引处。这意味着在底层模型中,行一次可能会移动多个索引。

重要提示:当您想要确保表在移动行后保持过滤/排序状态时,请确保您调用了 setSortsOnUpdates(true)在您 table 的分类器上。

关于Java:如何在不使用 TransferHandler 的情况下拖动 JTable 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58043707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com