Primefaces 在p:dataTable中组合拖放和重新排序

Primefaces 在p:dataTable中组合拖放和重新排序,primefaces,primefaces-datatable,Primefaces,Primefaces Datatable,我需要在DataTable行上组合拖放和重新排序。我知道有很多方法可以在不同的列上执行此操作,比如一列用于重新排序,另一列用于拖放,但我需要在一个元素上执行此操作。 我尝试了不同的方法,但都不管用。问题是,一旦重新排序被触发,我就不能把它放在这个区域。它总是返回到表的末尾。 获取鼠标位置是行不通的,因为我需要让它对移动设备具有响应能力和可用性 HTML: Bean,以防需要: public class DNDCarsView implements Serializable { privat

我需要在DataTable行上组合拖放和重新排序。我知道有很多方法可以在不同的列上执行此操作,比如一列用于重新排序,另一列用于拖放,但我需要在一个元素上执行此操作。 我尝试了不同的方法,但都不管用。问题是,一旦重新排序被触发,我就不能把它放在这个区域。它总是返回到表的末尾。 获取鼠标位置是行不通的,因为我需要让它对移动设备具有响应能力和可用性

HTML:

Bean,以防需要:

public class DNDCarsView implements Serializable {

  private List<Car> cars;
  private List<Car> droppedCars;

  @PostConstruct
  public void init() {
    cars = createCars(9);
    droppedCars = new ArrayList<>();
  }

  public List<Car> createCars(int size) {
    List<Car> list = new ArrayList<>();
    for (int i = 0; i < size; i++) {
      list.add(new Car("" + i, "Brand" + i, i * 2000, "Color" + i));
    }
    return list;
  }

  public void onCarDrop(DragDropEvent ddEvent) {
    Object car = ddEvent.getData();

    droppedCars.add((Car) car);
    cars.remove(car);
  }

  public void onReorder(ReorderEvent event) {
    Car car = cars.get(event.getFromIndex());
    cars.add(event.getToIndex(), car);
    cars.remove(event.getFromIndex());
  }
//Getter & Setter
}
有没有办法把这两者结合起来,让它运行起来? 提前谢谢

编辑: 我希望对DataTable中的行重新排序,并且能够将拖动的行放到字段集中

第6.2.12条 JSF2.2

编辑2: 经过一个月的努力,我还没有找到解决问题的好办法。我只是想,如果有人处理这个问题,我可以在这里分享

在我的例子p:column中,似乎没有办法在一个元素上实现拖放和columnreorder的结合。问题是,在拖动时总是会触发重新排序事件。当拖放到droparea中时,被拖动元素的dragId为null,因为我们从reorder事件开始,但以拖放事件结束

由于不允许我改变任何不属于我的课程,我没有设法解决这个问题。最后,我将动作分为两个元素。因此,我制作了一个拖动手柄,用户可以将元素拖动到droparea中,并实现对列的重新排序


如果我是盲人,有人知道这个问题的答案,请随意写。也许它能帮助别人。至少,有没有办法做到这一点会很有趣

您可以指定您的用例吗?你的所有列都无法排序,尝试你的示例拖放也不起作用。我需要将拖放与重新排序结合起来。如果可能,在同一个元素上。拖放到另一个面板上,在同一列表中重新排序。我不确定你对排序的定义。你的意思是sort=reorder还是sort=PrimeFaces的原始排序函数?我的意思是对列的行值进行排序,对列的更改顺序进行重新排序,切换列配置,但在代码中,只有一列,因此不能重新排序;此外,拖放也不起作用,使用您的代码这是您的问题吗?。你的意思是重新排序,这样你的实际表就有更多的列,还是说如果列被排序,拖放操作就必须保持排序顺序?我稍微改变了这个问题,所以我希望它更清楚。我想对DataTable中的行重新排序,并将该行放入另一个字段集/面板。我无法使用该次要版本进行测试,但使用纯6.2拖放几乎可以正常工作,即使源列或/和目标列已排序,拖放后的结果仍保持正确的排序顺序。使用您的代码,唯一的限制是拖放仅在选择文本时有效,否则我无法拖放。这是您面临的问题吗?您可以指定您的用例吗?你的所有列都无法排序,尝试你的示例拖放也不起作用。我需要将拖放与重新排序结合起来。如果可能,在同一个元素上。拖放到另一个面板上,在同一列表中重新排序。我不确定你对排序的定义。你的意思是sort=reorder还是sort=PrimeFaces的原始排序函数?我的意思是对列的行值进行排序,对列的更改顺序进行重新排序,切换列配置,但在代码中,只有一列,因此不能重新排序;此外,拖放也不起作用,使用您的代码这是您的问题吗?。你的意思是重新排序,这样你的实际表就有更多的列,还是说如果列被排序,拖放操作就必须保持排序顺序?我稍微改变了这个问题,所以我希望它更清楚。我想对DataTable中的行重新排序,并将该行放入另一个字段集/面板。我无法使用该次要版本进行测试,但使用纯6.2拖放几乎可以正常工作,即使源列或/和目标列已排序,拖放后的结果仍保持正确的排序顺序。使用您的代码,您看到的唯一限制是拖放仅在选择文本时有效,否则我无法拖放这是您面临的问题吗?
    function handleDrop(event, ui) {
      var droppedCar = ui.draggable;
      droppedCar.fadeOut('fast');

    }
public class DNDCarsView implements Serializable {

  private List<Car> cars;
  private List<Car> droppedCars;

  @PostConstruct
  public void init() {
    cars = createCars(9);
    droppedCars = new ArrayList<>();
  }

  public List<Car> createCars(int size) {
    List<Car> list = new ArrayList<>();
    for (int i = 0; i < size; i++) {
      list.add(new Car("" + i, "Brand" + i, i * 2000, "Color" + i));
    }
    return list;
  }

  public void onCarDrop(DragDropEvent ddEvent) {
    Object car = ddEvent.getData();

    droppedCars.add((Car) car);
    cars.remove(car);
  }

  public void onReorder(ReorderEvent event) {
    Car car = cars.get(event.getFromIndex());
    cars.add(event.getToIndex(), car);
    cars.remove(event.getFromIndex());
  }
//Getter & Setter
}