2016-06-10 8 views
2

Ich integrierte javafx piechart auf meinem Swing-Panel funktioniert gut, aber meine Datenliste ist zu groß, um in die Legende zu passen und die Legende expandiert, was dazu führt, dass das Kreisdiagramm kleiner wird. Ich möchte es scrollbar machen, aber ich konnte keine Lösung finden. Ich bin neu bei javafx.Wie schränkt man die Legendengröße ein und macht sie mit einem Kreisdiagramm scrollbar? und javafx layouts

Auch, welches Layout würden Sie vorschlagen, damit piechart Panel und Szene in das jpanel passen? Wie Sie sehen, füllt mein Kreisdiagramm die Szene nicht aus. Ich möchte nicht, dass mein Diagramm schrumpft.

public PieChartPanel() { 
    this.setLayout(new BorderLayout()); 
    add(new JScrollPane(getJfxPanel()), BorderLayout.CENTER); 
} 

public JFXPanel getJfxPanel() { 
    if (jfxPanel == null) { 
     jfxPanel = new JFXPanel(); 
     jfxPanel.setScene(getScene()); 
    } 
    return jfxPanel; 
} 

public Scene getScene() { 
    if (scene == null) { 
     Group root = new Group(); 
     scene = new Scene(root, Color.ALICEBLUE); 

     javafx.scene.control.ScrollPane scroll = new ScrollPane(); 
     scroll.setFitToHeight(true); 
     scroll.setFitToWidth(true); 
     scroll.setContent(getPieChart()); 

     root.getChildren().addAll(scroll); 

    } 
    return scene; 
} 

private PieChart getPieChart() { 
    if (pieChart == null) { 
     ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(); 
     pieChart = new PieChart(pieChartData); 
     pieChart.setTitle("Toplam Talep (Ünite) Grafiği"); 
     pieChart.setLabelLineLength(20); 
     pieChart.setLegendSide(Side.RIGHT); 
     pieChart.setClockwise(true); 
    } 
    return pieChart; 
} 

eine Spalte Legende

one column legend

2 Spalte Legende verursacht Diagramm

2 column legend causes chart to shrink

Antwort

3

Wenn Sie PieChart erweitern Sie die Legend direkt zugreifen können, wie es protected ist, siehe: Chart

Dadurch, dass Sie etwas in dieser Richtung tun:

public class CustomPieChart extends PieChart { 
    public CustomPieChart(ObservableList<PieChart.Data> data){ 
     super(data); 
     setLabelLineLength(20); 
     createScrollableLegend(); 
     setLegendSide(Side.RIGHT); 
     setClockwise(true); 
    } 

    private void createScrollableLegend(){ 
     Legend legend = (Legend) getLegend(); 
     if(legend != null){ 
      legend.setPrefWidth(100); 
      ScrollPane scrollPane = new ScrollPane(legend); 
      scrollPane.setHbarPolicy(ScrollBarPolicy.NEVER); 
      scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED); 
      scrollPane.maxHeightProperty().bind(heightProperty()); 
      setLegend(scrollPane); 
     } 
    } 
} 

Hinweis: Wenn Sie gehen für Bei diesem Ansatz empfehle ich, dies zu aktualisieren: legend.setPrefWidth(100); um genauer auf Ihre LegendItem 's zu sein. Da dies die beste Lösung für große Anzeigenamen


Durch die oben in Ihren Code ersetzen und das Hinzufügen von ein paar Test-Items nicht die Notwendigkeit, dass die Bildlaufleisten zu verursachen, habe ich folgendes:

enter image description here


Layout-weise glaube ich Ihnen die Group und Scroll-Scheiben nicht benötigen Sie derzeit verwenden.Wenn Sie Ihre getScene() Methode aktualisieren, um die unter Ihnen eine kleine Verbesserung sehen sollte:

public Scene getScene() { 
    VBox root = new VBox(); 
    Scene scene = new Scene(root, Color.ALICEBLUE); 
    root.getChildren().addAll(getPieChart()); 
    return scene; 
} 

Weitere Verbesserungen hoffentlich die folgenden Beiträge können helfen:

+0

Ich habe es jetzt, das funktioniert wie ein Cha rm! Vielen Dank, ich schätze es sehr. Aber ich habe mit einem anderen Problem gekämpft. Ich verwende * MVC * und wenn ich meine Liste im Modell aktualisiere, kann ich auch die Liste in der Kreisdiagramm-Klasse sehen, aber nichts erscheint auf dem Bildschirm. Aber mit einer vordefinierten Liste funktioniert piechart gut. Ich verwende auch "Platform.runLater()", wenn Elemente in die Liste eingefügt werden. Was könnte das verursachen? – vantilator

1

I durch Standard denken die Legenden platziert sind in dem Boden schrumpfen. Da die Breite des Panels größer ist, können Sie die Legende in der Standardposition anzeigen.

Und Sie fügen das JFXPanel zu einem JScrollPane hinzu, das ich denke, ist nicht erforderlich.

add(new JScrollPane(getJfxPanel()), BorderLayout.CENTER); 

Sie können es direkt fügen Sie das Panel

add(getJfxPanel(), BorderLayout.CENTER); 

Und das Panel, das Sie die JFxPanel hinzufügen würde die gesamte Region der rechten Seite werden zu besetzen. Ich bin mir nicht sicher, welches Layout dieses Panel hat, also bin ich mir nicht sicher, ob es den gesamten rechten Seitenbereich einnimmt.

Und wenn Sie es wirklich scrollbar wollen, müssen Sie die Größe des JFXPanel basierend auf den Daten, die Sie für das Kreisdiagramm haben, einstellen und wie gewohnt in das JScrollpane platzieren.

Verwandte Themen