JavaFX — Как центрировать метки меток оси

#javafx #charts #axis

#javafx #Диаграммы #ось

Вопрос:

Хотелось бы установить text-alingment значение center для метки метки оси x диаграммы JavaFX.

У меня есть ось X оси чисел JavaFX с датами, использующая многострочный текст для меток меток. Установка метки галочки на «дд / ММ ГГГГ» или «ЧЧ: мм недд / ММ» с AxisX.setTickLabelFormatter(getTimeAxisString()) помощью . Пользовательская функция getTimeAxisString() предоставляет форматированную строку для метки галочки. По умолчанию это приводит к выравниванию текста по левому краю, как показано на этом рисунке: метки меток оси

Существует ли метод JavaFX для изменения текста здесь? Могу ли я назначить класс CSS для метки галочки?

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

1. хм.. не уверен, что вы имеете в виду, выравнивание второй строки обернутого текста? Ожидал бы, что это будет поддерживаться на уровне меток / текста, поэтому css может работать

Ответ №1:

Удивительно, но стилизация меток для меток напрямую не поддерживается. Кроме того, все диаграммы и сотрудники проявляют большую осторожность, чтобы не раскрывать узлы в своей иерархии ни в одном API (даже внутри). Похоже, нам нужно полагаться на детали реализации Axis ..

  • класс, инкапсулирующий состояние метки для метки, называется TickMark
  • в нем есть поле типа String с именем label: это строковое представление значения, настраиваемое с помощью преобразователя value -> String
  • в нем есть поле типа Text с именем TextNode: это узел, добавленный к оси, и узел, который мы хотим стилизовать
  • Текст как таковой не имеет класса стиля по умолчанию, который недоступен через axis.lookup(style)
  • TextNode не имеет пользовательского стиля по умолчанию, который мог бы быть задан его родительской осью (в отличие от метки оси)

Основная задача — получить доступ к тексту и затем оформить его, либо напрямую настроив его свойства, либо установив пользовательский класс стилей и настроив его с помощью css.

Основной путь решения — прослушивать дочерние элементы оси и настраивать свойства всех узлов типа Text при добавлении. Приведенный ниже фрагмент задает пользовательский класс стиля.

 xAxis.getChildrenUnmodifiable().addListener((ListChangeListener<Node>) c -> {
    while (c.next()) {
        if (c.wasAdded()) {
            for (Node mark : c.getAddedSubList()) {
                if (mark instanceof Text) {
                    mark.getStyleClass().add("axis-tick-mark-text-node");
                }
            }
            
        }
    }
});
  

Пример оформления:

 .axis-tick-mark-text-node {
    -fx-text-alignment: center;
    -fx-fill: red;
}
    
  

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

1. Действительно, удивительно. Я был удивлен ( разочарован), не сумев получить доступ к элементу метки метки. Ваше решение должно получить его. Попытаюсь вернуться, чтобы подтвердить, что это работает. Спасибо