如何在javafx折线图中删除图例

时间:2015-01-07 11:05:19

标签: javafx javafx-2 javafx-8

enter image description here我试图使用折线图绘制javafx条形图。使用绘制有两个点并删除线符号的垂直线绘制每个条形线。在我的应用程序中可能有很多系列(条形线),但只想显示两个传说。

目前,已添加许多系列,显示了传说。不知怎的,我只能展示两个传说并隐藏其他传说。但现在隐藏传说所使用的空格存在问题。

我目前的代码如下: -

    package graph;

    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.chart.NumberAxis;
    import javafx.scene.chart.XYChart;
    import javafx.scene.control.Tooltip;
    import javafx.stage.Stage;

    import com.sun.javafx.charts.Legend;


    public class BarGraphUsingLineChart extends Application {
    final NumberAxis xAxis = new NumberAxis();
    final NumberAxis yAxis = new NumberAxis();
    final MyLineChart<Number,Number> lineChart = 
            new MyLineChart<Number,Number>(xAxis,yAxis);

    private boolean valid=true;

    private boolean invalid=true;

    @Override public void start(Stage stage) {
        stage.setTitle("Bar Chart Using Lines");

        xAxis.setLabel("Month");

        lineChart.setTitle("BAR CHART DEMO");           


        ObservableList<XYChart.Series<Number,Number>> graphData = FXCollections.observableArrayList();

        for(int i=1; i<=10;i++)
        {
            if(i%2==0)
            {
                graphData.add(drawBarline(i*10, i*5, true));
            }
            else{
                graphData.add(drawBarline(i*10, i*5, false));
            }
        }
        //      Dont show symbol of line charts
        lineChart.setCreateSymbols(false);

        Scene scene  = new Scene(lineChart,800,600);       
        lineChart.setData(graphData);
        stage.setScene(scene);
        stage.getScene().getStylesheets().add("/graph/BarChart.css");

        updateStyleSheet();

        stage.show();
    }

    private XYChart.Series<Number, Number>  drawBarline(Number xAxis, Number yAxis, boolean valid)
    {

        XYChart.Series<Number, Number> channel_Series  = new XYChart.Series<Number, Number>();

        channel_Series.getData().add(new XYChart.Data<Number, Number>(yAxis, xAxis ));  

        channel_Series.getData().add(new XYChart.Data<Number, Number>(yAxis, 0.0 ));    

        if(valid)   {
            channel_Series.setName("Valid"); 
        }
        else
        {
            channel_Series.setName("Invalid");
        }

        return channel_Series;
    }
    private void updateStyleSheet()
    {
        for(Node symbol : lineChart.lookupAll(".chart-legend-item")){

            if(valid)
            {
                ((Legend)symbol.getParent()).getItems().get(0).setText("Valid");
                valid=false;
            }
            else if(invalid){
                ((Legend)symbol.getParent()).getItems().get(1).setText("Invalid"); 
                invalid=false;
            }
            else
            {
                symbol.setVisible(false);

            }
        }


        // Beloc code removes all the legends
        //lineChart.setLegendVisible(false);

        for (XYChart.Series<Number, Number> s : lineChart.getData()) {

            if(("Valid").equals(s.getName()))
            {
                s.getNode().setStyle("-fx-stroke: #0000FF; ");
            }
            else 
            {
                s.getNode().setStyle("-fx-stroke: #FF0000; ");
            }
            for (XYChart.Data<Number, Number> d : s.getData()) {
                Tooltip.install(d.getNode(), new Tooltip("Frequency: "+
                        d.getXValue()+ " THz, Power: "+
                        d.getYValue().doubleValue()+" unit"));
            }
        }
    }

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

BarChart.css contains are as below:-

.default-color0.chart-legend-item-symbol{
    -fx-background-color: #0000FF;
 }
.default-color1.chart-legend-item-symbol{
    -fx-background-color: #FF0000;
 }

请帮我删除图例或缩小添加图例的组件。非常感谢

1 个答案:

答案 0 :(得分:4)

由于您已经在处理Legend,因此您可以使用其项目,删除不需要的项目,因此图例仅显示两项。

使用流,您可以将前两个项目标记为&#34;有效&#34; /&#34;无效&#34;其余为&#34;删除&#34;,最后你只需删除这些最后的项目。

private void updateStyleSheet() {
    Legend legend = (Legend)lineChart.lookup(".chart-legend");
    AtomicInteger count = new AtomicInteger();
    legend.getItems().forEach(item->{
        if(count.get()==0){
            item.setText("Valid");
        } else if(count.get()==1){
            item.setText("Invalid");
        } else {
            item.setText("Remove");
        }
        count.getAndIncrement();
    });
    legend.getItems().removeIf(item->item.getText().equals("Remove"));

    ...
}