在 header 单击时对 table 列进行排序?

Sort table columns on header click?

下面的代码产生这个输出:

如果您尝试此代码,当您单击它们的 header 时,vaadin 会自动知道如何对 CARMAKE 和 TOPSPEED 进行排序。

PASSENGER 和 DRIVER 未按 header 点击排序。

我该怎么做? Table 哪里说 "I don't know how to sort something of type PERSON so I won't add a click listener to that header"?

我能够扩展 beamItemContainer 并覆盖排序方法。然后我可以将按钮添加到对列进行排序的视图。但是我希望能够点击 table headers!

我原以为我可以添加 TableHeaderClickListeners,但是当我重写 beanItemContainer 的排序时,为什么 vaadin 没有为我做这件事?它已经为 CARMAKE 和 TOPSPEED 做到了。

@Override
public void init(VaadinRequest request) {

    BeanItemContainer<SportsCar> beans = new BeanItemContainer<SportsCar>(SportsCar.class);

    Person tom = new Person("Tom");
    Person dick = new Person("Dick");
    Person harry = new Person("Harry");

    beans.addBean(new SportsCar("ferrari",180.0,tom,dick));
    beans.addBean(new SportsCar("Aston Martin",165.0,harry,null));

    Table t = new Table();
    t.setContainerDataSource(beans);
    t.setSizeFull();
    this.setContent(t);

}

public class SportsCar {
    String carMake;
    double topspeed;
    Person driver;
    Person Passenger;

    public SportsCar(String carMake, double topspeed, Person driver, Person passenger) {
        this.carMake = carMake;
        this.topspeed = topspeed;
        this.driver = driver;
        this.Passenger = passenger;
    }

    /**
     * Get the carMake.
     * 
     * @return the carMake.
     */
    public String getcarMake() {
        return carMake;
    }

    /**
     * Set the carMake.
     * 
     * @param carMake
     *            the carMake.
     */
    public void setcarMake(String carMake) {
        this.carMake = carMake;
    }

    /**
     * Get the topspeed.
     * 
     * @return the topspeed.
     */
    public double getTopspeed() {
        return topspeed;
    }

    /**
     * Set the topspeed.
     * 
     * @param topspeed
     *            the topspeed.
     */
    public void setTopspeed(double topspeed) {
        this.topspeed = topspeed;
    }

    /**
     * Get the driver.
     * 
     * @return the driver.
     */
    public Person getDriver() {
        return driver;
    }

    /**
     * Set the driver.
     * 
     * @param driver
     *            the driver.
     */
    public void setDriver(Person driver) {
        this.driver = driver;
    }

    /**
     * Get the passenger.
     * 
     * @return the passenger.
     */
    public Person getPassenger() {
        return Passenger;
    }

    /**
     * Set the passenger.
     * 
     * @param passenger
     *            the passenger.
     */
    public void setPassenger(Person passenger) {
        Passenger = passenger;
    }

}

public class Person {

    String carMake;

    /**
     * Create a Demo.Person.
     */
    public Person(String carMake) {
        this.carMake = carMake;
    }

    /**
     * Get the carMake.
     * 
     * @return the carMake.
     */
    public String getcarMake() {
        return carMake;
    }

    /**
     * Set the carMake.
     * 
     * @param carMake
     *            the carMake.
     */
    public void setcarMake(String carMake) {
        this.carMake = carMake;
    }

    @Override
    public String toString(){
        return carMake;
    }
}

Java 不知道如何比较对象本身。首先,您必须指定,可以通过实现接口 "Comparable" 来比较这些对象。然后你需要像这样覆盖 compareTo 方法:

public int compareTo(Person p) {
    return getcarMake().compareTo(p.getcarMake());
}

这应该可以解决问题(不过我没有测试)。