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

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



一只斗牛犬
浏览 81回答 1
1回答

牛魔王的故事

为了实现此行为,您可以使用 aMouseListener和 a的组合MouseMotionListener。DefaultTableModel提供的功能可用于将Point事件的行转换为事件发生的行。使用此功能,我们可以有效地拖动表格行。下面的代码示例显示了实时拖动表格行的基本实现。请注意,table和tableModel属性被故意弱化:我们不希望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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java