JavaFX शो/छुपा सीरीज संभव टॉगल करने के लिए चार्ट लेजेंड का उपयोग करें?




charts legend (2)

श्रृंखला को शो / छुपाने के लिए टच की कथा का उपयोग करना संभव है?

मुझे एक किंवदंती के साथ एक LineChart मिला है और बहुत Series ताकि आप अच्छी तरह से जानकारी पढ़ नहीं सकें। मैं सोच रहा था कि श्रृंखला दिखाने के लिए / छिपाने के लिए कथा को इस्तेमाल करने की कोई संभावना है?

मेरी Series अधिकांश नाम बहुत लंबे होते हैं और यह बहुत ही अजीब लग रहा है यदि वे दंतकथा में दो बार एक बार लिखे जाते हैं, तो आप जानते हैं कि कौन सी रंग Series अंतर्गत आता है और दूसरी बार एक CheckBox लिए उन्हें टॉगल करने के अलावा।

1 संपादित करें: शायद मैं स्पष्ट नहीं था, भले ही इसके लिए कोई फ़ंक्शन निर्मित न हो, मैं कुछ इनपुट का प्रयोग कर सकता था कि कैसे एक वर्कआराउंड ऐसा दिख सकता है, क्योंकि मैं कुछ भी नहीं कर सकता


यहां बताया गया है कि मैं इसे कैसे हल करता हूं - मैं किसी भी सरल अंतर्निहित समाधान के बारे में नहीं जानता हूं

LineChart<Number, Number> chart;

for (Node n : chart.getChildrenUnmodifiable()) {
    if (n instanceof Legend) {
        Legend l = (Legend) n;
        for (Legend.LegendItem li : l.getItems()) {
            for (XYChart.Series<Number, Number> s : chart.getData()) {
                if (s.getName().equals(li.getText())) {
                    li.getSymbol().setCursor(Cursor.HAND); // Hint user that legend symbol is clickable
                    li.getSymbol().setOnMouseClicked(me -> {
                        if (me.getButton() == MouseButton.PRIMARY) {
                            s.getNode().setVisible(!s.getNode().isVisible()); // Toggle visibility of line
                            for (XYChart.Data<Number, Number> d : s.getData()) {
                                if (d.getNode() != null) {
                                    d.getNode().setVisible(s.getNode().isVisible()); // Toggle visibility of every node in the series
                                }
                            }
                        }
                    });
                    break;
                }
            }
        }
    }
}

आपको अपने कोड पर एक बार इस कोड को चलाने की जरूरत है (इस उदाहरण में LineChart , लेकिन आप शायद इसे किसी अन्य चार्ट में अनुकूलित कर सकते हैं)। मैं Legend बच्चा खोजता हूं, और उसके बाद अपने सारे 'वस्तुओं पर फिर से चलना मैं लीजेंड आइटम से नाम के आधार पर सही श्रृंखला के लिए मैच करता हूं - मेरे अनुभव से वे हमेशा मैच करते हैं, और मुझे उनका मिलान करने का बेहतर तरीका नहीं मिल सका। तो यह उस विशिष्ट कथा आइटम को सही ईवेंट हैंडलर जोड़ने का मामला है।


संदर्भ के लिए, एक समान दृष्टिकोण JFreeChart में JFreeChart साथ काम करता है जैसा कि यहां दिखाया गया है । इस उदाहरण से अनुकूलित, नीचे भिन्नता ChartMouseListenerFX के लिए ChartViewer । एक श्रृंखला या इसके किंवदंती आइटम पर क्लिक करें ताकि एक श्रृंखला अदृश्य हो सके; इसे पुनर्स्थापित करने के लिए कहीं भी क्लिक करें

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.entity.LegendItemEntity;
import org.jfree.chart.entity.XYItemEntity;
import org.jfree.chart.fx.ChartViewer;
import org.jfree.chart.fx.interaction.ChartMouseEventFX;
import org.jfree.chart.fx.interaction.ChartMouseListenerFX;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://.com/a/44967809/230513
 * @see https://.com/a/43286042/230513
 */
public class VisibleTest extends Application {

    @Override
    public void start(Stage stage) {
        XYSeriesCollection dataset = new XYSeriesCollection();
        for (int i = 0; i < 3; i++) {
            XYSeries series = new XYSeries("value" + i);
            for (double t = 0; t < 2 * Math.PI; t += 0.5) {
                series.add(t, Math.sin(t) + i);
            }
            dataset.addSeries(series);
        }
        NumberAxis xAxis = new NumberAxis("domain");
        NumberAxis yAxis = new NumberAxis("range");
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, true);
        renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
        XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
        JFreeChart chart = new JFreeChart("Test", plot);
        ChartViewer viewer = new ChartViewer(chart);
        viewer.addChartMouseListener(new ChartMouseListenerFX() {
            @Override
            public void chartMouseClicked(ChartMouseEventFX e) {
                ChartEntity ce = e.getEntity();
                if (ce instanceof XYItemEntity) {
                    XYItemEntity item = (XYItemEntity) ce;
                    renderer.setSeriesVisible(item.getSeriesIndex(), false);
                } else if (ce instanceof LegendItemEntity) {
                    LegendItemEntity item = (LegendItemEntity) ce;
                    Comparable key = item.getSeriesKey();
                    renderer.setSeriesVisible(dataset.getSeriesIndex(key), false);
                } else {
                    for (int i = 0; i < dataset.getSeriesCount(); i++) {
                        renderer.setSeriesVisible(i, true);
                    }
                }
            }

            @Override
            public void chartMouseMoved(ChartMouseEventFX e) {}
        });
        stage.setScene(new Scene(viewer));
        stage.setTitle("JFreeChartFX");
        stage.setWidth(640);
        stage.setHeight(480);
        stage.show();
    }

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




legend