2013-03-06 23 views
5

z tym kodem mogę wygenerować wykres słupkowy 10 barów teraz chcę wiedzieć, jak wyświetlić wartość każdego paska na górze paska jak na załączonym obrazu: enter image description herejak wyświetlić wartość bar na górze bar JavaFX

tutaj jest kod:

public class BarChartSample extends Application { 


    @Override public void start(Stage stage) { 
     stage.setTitle("Bar Chart Sample"); 
     final CategoryAxis xAxis = new CategoryAxis(); 
     final NumberAxis yAxis = new NumberAxis(); 
     final BarChart<String,Number> bc = 
      new BarChart<String,Number>(xAxis,yAxis); 
     bc.setTitle("Country Summary"); 
     xAxis.setLabel("bars");  
     yAxis.setLabel("Value"); 

     XYChart.Series series1 = new XYChart.Series(); 
     series1.setName("...");  

for(int i=0;i<10;i++) 
{ 
    //here i want to change color of bar if value of i is >5 than red if i>8 than blue 
series1.getData().add(new XYChart.Data("Value", i)); 

}   

} 

public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

istotne http://stackoverflow.com/a/41494789/4469105 – r3r57

Odpowiedz

14

Wewnątrz ChangeListener za przedmiot każde dane za node nieruchomości, można wywołać następującą funkcję aby dodać etykietę do górnej części paska:

private void displayLabelForData(XYChart.Data<String, Number> data) { 
    final Node node = data.getNode(); 
    final Text dataText = new Text(data.getYValue() + ""); 
    node.parentProperty().addListener(new ChangeListener<Parent>() { 
    @Override public void changed(ObservableValue<? extends Parent> ov, Parent oldParent, Parent parent) { 
     Group parentGroup = (Group) parent; 
     parentGroup.getChildren().add(dataText); 
    } 
    }); 

    node.boundsInParentProperty().addListener(new ChangeListener<Bounds>() { 
    @Override public void changed(ObservableValue<? extends Bounds> ov, Bounds oldBounds, Bounds bounds) { 
     dataText.setLayoutX(
     Math.round(
      bounds.getMinX() + bounds.getWidth()/2 - dataText.prefWidth(-1)/2 
     ) 
    ); 
     dataText.setLayoutY(
     Math.round(
      bounds.getMinY() - dataText.prefHeight(-1) * 0.5 
     ) 
    ); 
    } 
    }); 
} 

kod działa dodając etykietę tekstową do rodzica każdego węzła pręta, a następnie dynamiczne pozycjonowanie etykiety tekstowej w oparciu o pasek i ograniczenia tekstu za każdym razem, gdy pasek zmienia się.

Dla tego stworzyłem sample solution.

labeledchartwithlegend

+0

podczas kompilacji kodu, który daje błąd "<>" operator nie jest dozwolony dla poziomu źródłowego poniżej 1.7 w końcowej BarChart bc = new BarChart <> (xAxis, yAxis) ; – H4SN

+0

Kod jest napisany dla Java 7 przy użyciu [operatora diamentu] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html). Możesz ustawić kompilator tak, aby akceptował źródło Java 7 jako minimum (opcja [javac] (http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html) opcja -source 7 ') lub zmień instrukcję na' BarChart bc = new BarChart (xAxis, yAxis); ', który jest źródłowy zgodny z Javą 6. Pamiętaj, że nawet jeśli używasz jdk7 +, możesz kompilacji dla poziomu źródła poniżej 7. – jewelsea

+0

Dziękuję bardzo teraz działa kod :) :) – H4SN

0

Nie ma takiej opcji w JFX, o etykietach pokazujących pasek w tabeli.

Co można zrobić, to rozszerzyć klasę wykresów słupkowych i zastąpić metody dotyczące tworzenia i przydzielania zawartości.

Możesz obserwować kod wykresów w projekcie javafx-ui-charts, który możesz pobrać z repozytorium OpenJFX.

Kodeks wykresów nie jest trudne do zrozumienia ...

Pobierz rt-repozytorium z http://hg.openjdk.java.net/openjfx/8/master/rt

Znajdź projekt JavaFX-UI-wykresów i otwórz go. Znajdź implementację wykresu słupkowego.

+0

Przeszukałem przydzieleniu i jeszcze nie szczęścia można podać przykład czy można edytować kod .. dzięki za intrest – H4SN

+0

Dodano link do kodu otwartych wykresów repo –