我需要扩展AbstractTableModel来表示表中的一些数据。我有一个类Car
,它应代表表中的一个项目(行):
public class Car implements Comparable<Car> {
public String make;
public int year;
public double engineVol;
public double maxSpeed;
// ...getters/setters for the fields...
public Car (String make, int year, double engineVol, double maxSpeed) {
this.make = make;
this.year = year;
this.engineVol = engineVol;
this.maxSpeed = maxSpeed;
}
@Override
public boolean equals(Object other) {
if (this == other) return true;
if (other == null || getClass() != other.getClass()) return false;
Car car = (Car) other;
if (year != car.year) return false;
if (Double.compare(car.engineVol, engineVol) != 0) return false;
if (Double.compare(car.maxSpeed, maxSpeed) != 0) return false;
return make.equals(car.make);
}
@Override
public int hashCode() {
int result;
long temp;
result = make.hashCode();
result = 31 * result + year;
temp = Double.doubleToLongBits(engineVol);
result = 31 * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(maxSpeed);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public int compareTo(Car other) {
return this.make.compareTo(other.make);
}
}
这些Car
个对象存储在HashSet
中,CarTableModel
位于public class CarTableModel extends AbstractTableModel {
private static final long serialVersionUID = 7927259757559420606L;
private HashSet<Car> cars;
public CarTableModel(HashSet<Car> cars) {
this.cars = cars;
}
@Override
public int getRowCount() {
return cars.size();
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return null;
}
}
:
import Tkinter as tk
import tkFont
class Display():
def __init__(self, parent):
self.parent = parent
self._geom = '200x200+0+0'
parent.geometry("{0}x{1}+0+0".format(parent.winfo_screenwidth(), parent.winfo_screenheight()))
parent.overrideredirect(1)
parent.title('My App')
parent.configure(background='#000000')
parent.displayFont = tkFont.Font(family="Helvetica", size=150)
self.messageString="Hello"
self.message = tk.Message(self, text=self.messageString, bg="#000000", font=parent.displayFont, fg="#777777", justify="c")
self.message.place(relx=.5, rely=.5, anchor="c")
def main():
root = tk.Tk()
window = Display(root)
root.mainloop()
if __name__ == '__main__':
main()
据我所知,我需要在AbstractTableModel中覆盖至少3个方法。如何为HashSet覆盖getValueAt?关于HashSet的那些rowIndex和columnIndex参数是什么?如果我们无法通过索引获取值,那么这些indeces如何应用于HashSet?它有可能吗?
P.S。在这里使用HashSet并不是我的随意,它是大学的任务,所以它必须这样。
答案 0 :(得分:2)
如何为HashSet覆盖getValueAt?
不要使用HashSet。您通常会使用ArrayList,因此按照将它们添加到List中的顺序定义行。
例如,查看Table Row Model,其中介绍了创建自定义模型的过程。它还提供了一个通用的TableModel,以便在您希望的过程中简化该过程。
在这里使用HashSet并不是我的任性,这是一项大学任务,所以必须采用这种方式。
错过了评论。我不知道为什么你需要使用HashSet,因为没有直接的方法来访问数据。因此,在我看来,每次需要行时都需要遍历Set。效率不高。
答案 1 :(得分:1)
您可以尝试使用LinkedHashSet
。但目前还不清楚如何将columnIndex
与Car
一起使用。
也许,来自番石榴的ArrayTable会帮助你。
答案 2 :(得分:1)
您必须知道,即使您考虑使用Iterator
来获取HashSet的第n个值,订单也是未定义的。
此处,来自JavaDoc
它不保证集合的迭代顺序;在 特别是,它不保证订单将保持不变 随着时间的推移。
但是,如果你真的必须使用这个集合,这里是getValueAt
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Optional<Car> tmpCar = cars.stream()
.skip(rowIndex) // Assuming your rows begin with 0
.findFirst();
return tmpCar.isPresent() ? tmpCar : null;
}
答案 3 :(得分:0)
因此,如果您必须使用HashSet
,则可以执行以下操作:
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Car car = null;
int = 0;
for (Car c : cars) {
if (i == rowIndex) {
car = c;
break;
}
i++;
}
if (car == null) // handle this situation with your rules
return "";
return car.get<Field as described in your columns>; //
}
请记住,订单无法保证。然后测试很多。