在 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());
}
这应该可以解决问题(不过我没有测试)。
下面的代码产生这个输出:
如果您尝试此代码,当您单击它们的 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());
}
这应该可以解决问题(不过我没有测试)。