为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

为了实现此行为,您可以使用 aMouseListener和 a的组合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


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信