Как стать автором
Обновить

Комментарии 6

JavaFx это не совсем RIA фреймворк. Скажем так, он позволяет делать как RIA, так и полноценный desktop.
Раньше, Oracle писал, что это вроде RIA, но теперь поправились и уже не дают классификацию JavaFX. Пишут, что «JavaFX is the next step in the evolution of Java as a rich client platform.»
Согласен, версия 1.3 была точно RIA, а вот с выходом двойки это полноценная графическая библиотека и замена swing
Кстати, вы заметили, что шкала на оси у не соответствует сетке и точкам на графике? Я поэкспериментировал и не совсем понял, почему некоторые вещи работают так, а не иначе. Изначально вы добавляете на график 3 точки, потом показываете сцену, шкалы х и у выравниваются по этим 3-м точкам. у принимает максимальное значение 4.5, как и у вас на скриншоте. Затем вы добвляете ещё одну точку. И тут х, почему-то выравнивается, а у — нет. Если добавлять точку перед вызовом primaryStage.show(), всё отрисовывается хорошо. Поведение в принципе логичное, но не понятно, почему х выравнивается, а у — нет. Ещё интересный момент: задизейблил анимацию для графика — всё выравнивается как надо при любом порядке добавления 4-й точки.
Я предполагаю, что это обусловлено сложной системной обновления шкал. Там происходит сильная наркомания.
Ситуация выглядит так (если я не ошибаюсь).
Для изменения размеров шкал служит этот метод (из класса 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();
        }
Если написать небольшой тест
Код
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

И использовать его, то получится, что глюки возникают где-то в классах NumberAxis/Axis и на нахождение их уйдет много времени. Но тема интересная, спасибо)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации