Комментарии 6
JavaFx это не совсем RIA фреймворк. Скажем так, он позволяет делать как RIA, так и полноценный desktop.
0
Раньше, Oracle писал, что это вроде RIA, но теперь поправились и уже не дают классификацию JavaFX. Пишут, что «JavaFX is the next step in the evolution of Java as a rich client platform.»
0
Кстати, вы заметили, что шкала на оси у не соответствует сетке и точкам на графике? Я поэкспериментировал и не совсем понял, почему некоторые вещи работают так, а не иначе. Изначально вы добавляете на график 3 точки, потом показываете сцену, шкалы х и у выравниваются по этим 3-м точкам. у принимает максимальное значение 4.5, как и у вас на скриншоте. Затем вы добвляете ещё одну точку. И тут х, почему-то выравнивается, а у — нет. Если добавлять точку перед вызовом primaryStage.show(), всё отрисовывается хорошо. Поведение в принципе логичное, но не понятно, почему х выравнивается, а у — нет. Ещё интересный момент: задизейблил анимацию для графика — всё выравнивается как надо при любом порядке добавления 4-й точки.
0
Я предполагаю, что это обусловлено сложной системной обновления шкал. Там происходит сильная наркомания.
Ситуация выглядит так (если я не ошибаюсь).
Для изменения размеров шкал служит этот метод (из класса LineChart):
А вот использование и обновление шкал прописано в классе предке XYChart и выражается в таких местах:
1. Вызов изменений размера при изменении свойства autoRanging (в любом случае):
И еще один вызов есть в методе layoutChartChildren:
Ситуация выглядит так (если я не ошибаюсь).
Для изменения размеров шкал служит этот метод (из класса LineChart):
@Override protected void updateAxisRange() {
final Axis<X> xa = getXAxis();
final Axis<Y> ya = getYAxis();
List<X> xData = null;
List<Y> yData = null;
if(xa.isAutoRanging()) xData = new ArrayList<X>();
if(ya.isAutoRanging()) yData = new ArrayList<Y>();
if(xData != null || yData != null) {
for(Series<X,Y> series : getData()) {
for(Data<X,Y> data: series.getData()) {
if(xData != null) xData.add(data.getXValue());
if(yData != null) yData.add(data.getYValue());
}
}
// RT-32838 No need to invalidate range if there is one data item - whose value is zero.
if(xData != null && !(xData.size() == 1 && getXAxis().toNumericValue(xData.get(0)) == 0)) {
xa.invalidateRange(xData);
}
if(yData != null && !(yData.size() == 1 && getYAxis().toNumericValue(yData.get(0)) == 0)) {
ya.invalidateRange(yData);
}
}
}
А вот использование и обновление шкал прописано в классе предке XYChart и выражается в таких местах:
1. Вызов изменений размера при изменении свойства autoRanging (в любом случае):
xAxis.autoRangingProperty().addListener((ov, t, t1) -> {
updateAxisRange();
});
yAxis.autoRangingProperty().addListener((ov, t, t1) -> {
updateAxisRange();
});
И еще один вызов есть в методе layoutChartChildren:
if (!rangeValid) {
rangeValid = true;
if(getData() != null) updateAxisRange();
}
0
Если написать небольшой тест
И использовать его, то получится, что глюки возникают где-то в классах NumberAxis/Axis и на нахождение их уйдет много времени. Но тема интересная, спасибо)
Код
public class TempLineChart<X,Y> extends LineChart<X,Y> {
public TempLineChart(@NamedArg("xAxis") Axis<X> xAxis, @NamedArg("yAxis") Axis<Y> yAxis) {
super(xAxis, yAxis);
}
public TempLineChart(@NamedArg("xAxis") Axis<X> xAxis, @NamedArg("yAxis") Axis<Y> yAxis, @NamedArg("data") ObservableList<Series<X, Y>> data) {
super(xAxis, yAxis, data);
}
/** @inheritDoc */
@Override protected void updateAxisRange() {
final Axis<X> xa = getXAxis();
final Axis<Y> ya = getYAxis();
List<X> xData = null;
List<Y> yData = null;
if(xa.isAutoRanging()) xData = new ArrayList<X>();
if(ya.isAutoRanging()) yData = new ArrayList<Y>();
if(xData != null || yData != null) {
for(Series<X,Y> series : getData()) {
for(Data<X,Y> data: series.getData()) {
if(xData != null) xData.add(data.getXValue());
if(yData != null) yData.add(data.getYValue());
}
}
// RT-32838 No need to invalidate range if there is one data item - whose value is zero.
if(xData != null && !(xData.size() == 1 && getXAxis().toNumericValue(xData.get(0)) == 0)) {
Log.log(Log.debugIndex,"xData validated");
xa.invalidateRange(xData);
}
if(yData != null && !(yData.size() == 1 && getYAxis().toNumericValue(yData.get(0)) == 0)) {
ya.invalidateRange(yData);
Log.log(Log.debugIndex,yData.toArray());
Log.log(Log.debugIndex,"yData validated");
}
}
}
}
Результат
[2014-11-01 22:09:27.893:Anji Debug]:
1 2 4
[2014-11-01 22:09:27.899:Anji Debug]:
yData validated
[2014-11-01 22:09:27.899:Anji Debug]:
xData validated
[2014-11-01 22:09:27.941:Anji Debug]:
Added
[2014-11-01 22:09:27.975:Anji Debug]:
1 2 4 5
[2014-11-01 22:09:27.975:Anji Debug]:
yData validated
[2014-11-01 22:09:27.975:Anji Debug]:
xData validated
1 2 4
[2014-11-01 22:09:27.899:Anji Debug]:
yData validated
[2014-11-01 22:09:27.899:Anji Debug]:
xData validated
[2014-11-01 22:09:27.941:Anji Debug]:
Added
[2014-11-01 22:09:27.975:Anji Debug]:
1 2 4 5
[2014-11-01 22:09:27.975:Anji Debug]:
yData validated
[2014-11-01 22:09:27.975:Anji Debug]:
xData validated
И использовать его, то получится, что глюки возникают где-то в классах NumberAxis/Axis и на нахождение их уйдет много времени. Но тема интересная, спасибо)
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Гибкая настройка графиков в JavaFX