在javafx tableview中,根据外部值

时间:2017-10-10 23:29:29

标签: javafx

我正在构建一个JavaFX应用程序。该应用程序可视化时间序列数据。例如,我有一张表格显示2001年的黄金价格。用户希望将其与2007年的价格或她选择的其他年份进行比较。

我想格式化表格单元格,以便,如果2007年的价格已经超过2001年的价格,超过给定的幅度,它将获得不同的颜色。

该表的数据模型是Observable列表。可观察列表中的每个项都实例化一个非常简单的类,例如

@Entity
@Table(name = "commodity")
@XmlRootElement
public class Commodity {
    private StringProperty commodityName;
    private DoubleProperty unitPrice;
    private DoubleProperty unitValue;
}

我正在尝试为这个问题设计一个战略方法。我是JavaFx的新手。

我正在考虑以下事项:

(1)只需在Commodity类中创建每个成员的副本,即:

@Entity
@Table(name = "commodity")
@XmlRootElement
public class Commodity {
    private StringProperty commodityName;
    private DoubleProperty price;
    private StringProperty comparatorCommodityName;
    private DoubleProperty comparatorPrice;
}

从当前年份和比较年份的持久实体中填充此内容。例如,如果当前年份是2016年,价格将是2016年的价格,如果比较年份是2011年,ComparativePrice将是2011年的价格。

然后为每个列(商品名称,价格等)创建一个CellFactory,询问是否

price - comparatorPrice > threshold

针对应用和用户定义的某个阈值。我不喜欢这个,因为它不是抽象的;每个CellFactory都必须单独制作。

(2)在某种程度上,使商品类的成员更加复杂,因此他们随身携带决定他们是否已经改变的信息。我想扩展Property类但这看起来很难,因为它们是接口,据我所知,创建一个新的Property类将涉及实现接口的所有方法。我对界面不太熟悉,所以我可能误解了底层技术。

(3)使用地图;使底层模型成为MapValue模型。我没有探究过这个,但想法是给定行和列的单元格数据是一个Map,其中Commodity对象本身将是检索另一个对象的关键,它的比较器

(4)将新成员添加到作为比较器的商品类中:

@Entity
@Table(name = "commodity")
@XmlRootElement
public class Commodity {
    private StringProperty commodityName;
    private DoubleProperty price;
    private StringProperty comparatorCommodityName;
    private DoubleProperty comparatorPrice;
    private Commodity comparator = null;
    public void setComparator(Commodity comparator){
         this.comparator=comparator;
    }
    public Comparator getComparator(){
         return comparator;
    }
}
然后,CellFactory需要询问基本实体及其比较器成员,以决定如何格式化单元格。这不是很抽象,因为必须为每个成员编写代码,但至少它会创建某种标准。

我没有发现这些选项中的任何一个非常令人满意,这让我想知道是否有人之前已经这样做了,我只需要学习更多JavaFX。

我希望这个问题的范围不太宽泛。问题非常具体。

0 个答案:

没有答案