2016-01-12 3 views
0

Я использую расширенный класс BarChart для добавления вертикальных линий и текста поверх баров. Это отлично работает, но я хочу отобразить небольшой текст в правом верхнем углу горизонтальной линии.Как добавить текст в горизонтальную линию с помощью JavaFX BarChart

Я попытался это без успеха:

public void addHorizontalValueMarker(Data<X, Y> marker) { 
    Objects.requireNonNull(marker, "the marker must not be null"); 
    if (horizontalMarkers.contains(marker)) return; 
    Line line = new Line(); 
    line.setStroke(Color.RED);   
    marker.setNode(line); 
    getPlotChildren().add(line); 

    // Adding a label 
    Node text = new Text("average"); 
    nodeMap.put(marker.getNode(), text); 
    getPlotChildren().add(text); 

    horizontalMarkers.add(marker); 
} 

@Override 
protected void layoutPlotChildren() { 
    super.layoutPlotChildren(); 
    for (Node bar : nodeMap.keySet()) { 
     Node text = nodeMap.get(bar); 
     text.relocate(bar.getBoundsInParent().getMinX() + bar.getBoundsInParent().getWidth()/2 - text.prefWidth(-1)/2, bar.getBoundsInParent().getMinY() - 30); 
    } 
    for (Data<X, Y> horizontalMarker : horizontalMarkers) { 
     Line line = (Line) horizontalMarker.getNode(); 
     line.setStartX(0); 
     line.setEndX(getBoundsInLocal().getWidth()); 
     line.setStartY(getYAxis().getDisplayPosition(horizontalMarker.getYValue()) + 0.5); // 0.5 for crispness 
     line.setEndY(line.getStartY()); 
     line.toFront(); 
    } 

} 

Что я делаю не так?

ответ

1

Вам необходимо переместить текст после перемещения маркера, т.е. е. код интегрирован в нужном положении:

for (Data<X, Y> horizontalMarker : horizontalMarkers) { 
     Line line = (Line) horizontalMarker.getNode(); 
     line.setStartX(0); 
     line.setEndX(getBoundsInLocal().getWidth()); 
     line.setStartY(getYAxis().getDisplayPosition(horizontalMarker.getYValue()) + 0.5); // 0.5 for crispness 
     line.setEndY(line.getStartY()); 
     line.toFront(); 

     Node text = nodeMap.get(line); 
     text.relocate(line.getBoundsInParent().getMinX() + line.getBoundsInParent().getWidth()/2 - text.prefWidth(-1)/2, line.getBoundsInParent().getMinY() - 30); 
    } 

Кстати, я предлагаю создать специальный класс маркеров для того, которая держит линию и текст, а не с помощью «свободной» карты.

Смежные вопросы