在JavaFx中,我有一个LineChart lc
,我为此创建并添加了一个系列,
lc.getData().addAll(series1);
它显示得很好,但是似乎对所有个数据点进行了采样,以使整个域适合图表。
是否有一种方法可以强制LineChart仅显示该系列的最后10个数据点?
最终,我想创建一种方法来平移图表内容,以便根据平移位置显示数据窗口。
我找到了this SO post,但是它删除了数据,这意味着我需要将其重新添加回去。我宁愿将所有数据保留在系列中,并尽可能设置该系列的可用范围。
答案 0 :(得分:0)
我自己使用标准的fx库制定了解决方案。
只要水平轴为NumberAxis
,就可以使用setLowerBound()
和setUpperBound()
函数。
与滚动条结合使用,效果很好。
例如,
final static int MAX_DISPLAY = 100
LineChart<Number, Number> lineChart;
ScrollBar scroller;
scroller.setMin(0);
scroller.setMax(1000 - MAX_DISPLAY);
scroller.valueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number t1) {
double pos = scroller.getValue();
NumberAxis na = (NumberAxis)lineChart.getXAxis();
na.setLowerBound(pos);
na.setUpperBound(pos + MAX_DISPLAY);
}
});
注意-如果使用Scene Builder,则LineChart x轴将默认为CatergoryAxis,因此请确保编辑.fxml文件并将其手动更改为NumberAxis。
另外,在我的用例中,由于x轴表示Unix时代,您可以使用以下代码(在我的情况下为日期格式的字符串)将Number
值转换为其他值,
NumberAxis xAxis = (NumberAxis)lineChart.getXAxis();
xAxis.setTickLabelFormatter(new StringConverter<Number>() {
@Override
public String toString(Number object) {
return convertToDate(object.longValue());
}
@Override
public Number fromString(String string) {
return 0;
}
});