2015-04-05 32 views
0

現在我正在使用JavaFX圖表,但我需要爲每種圖表類型創建一個通用類。例如,我需要創建一個ScatterChart,我可以從這個類創建一個ScatterChart,其中X = Number和Y = Number軸,X = String和Y = Number軸,X = Number和Y = String軸或X = String和Y = String,但是我發現在使用它之前必須定義圖表的類型,並且不可能在同一個圖表上更改座標軸的類型。如何使用數字或字符串軸創建泛型JavaFX XYChart?

我試圖讓這一點,但方法來操作數據不起作用:

public class JFXPanelScatterChartNS extends JFXPanel.... 
..... 
private ScatterChart chart; 
....... 
public JFXPanelScatterChartNS(String[] xAxisCategories, String[] yAxisCategories){ 

     if(xAxisCategories != null && yAxisCategories != null){ 
      xAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(xAxisCategories))); 
      yAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(yAxisCategories))); 
      chart = new ScatterChart<String, String>(xAxisCategory, yAxisCategory); 
     }else if(xAxisCategories != null){ 
      xAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(xAxisCategories))); 
      yAxis = new NumberAxis(0.0,10.0,1.0); 
      chart = new ScatterChart<String, Number>(xAxisCategory, yAxis); 
     }else if(yAxisCategories != null){ 
      xAxis = new NumberAxis(0.0,10.0,1.0); 
      yAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(yAxisCategories))); 
      chart = new ScatterChart<Number, String>(xAxis, yAxisCategory); 
     }else{ 
      xAxis = new NumberAxis(0.0,10.0,1.0); 
      yAxis = new NumberAxis(0.0,10.0,1.0); 
      chart = new ScatterChart<Number, Number>(xAxis, yAxisCategory); 
     } 

     Platform.runLater(() -> { 
      createScene(withDragAndDrop); 
     }); 
    } 

謝謝您的幫助!

現在我該如何使用操作同一個類中的數據的方法? 在下面的示例中,ScatterChar僅適用於X軸=數字和Y軸=字符串。

我目前的做法是:

public void addSeries(String idSeries, String nameSeries, final Number xIni, final String yIni){   
     final XYChart.Series<Number,String> newSeries; 
     //Valido si el Id ya existe 
     final boolean seriesExist = seriesMap.containsKey(idSeries); 
     //si no existe el ID entonces creo la nueva serie 
     if(!seriesExist){ 
      newSeries = new XYChart.Series<>(); 
      ObservableList<XYChart.Data<Number, String>> listaSerie; 
      listaSerie = FXCollections.synchronizedObservableList(FXCollections.observableList(new ArrayList<XYChart.Data<Number, String>>())); 
      newSeries.setData(listaSerie); 
      newSeries.setName(nameSeries); 
      newSeries.getData().add(new XYChart.Data<>(xIni,yIni)); 

      Platform.runLater(() -> { 
       //Genero el index para la nueva serie 
       Integer newIndex = new Integer(chart.getData().size()); 
       chart.getData().add(newIndex.intValue(), newSeries); 
       seriesMap.put(idSeries, newIndex); 
      }); 
     } 
    } 

    public void setData(final String idSeries, final int index, final Number x, final String y){ 
     //valido que exista la serie 
     boolean seriesExist = seriesMap.containsKey(idSeries); 
     //obtengo el index de la serie, como fue almacenada en la grafica 
     Integer indexSerie = seriesMap.get(idSeries); 
     if(seriesExist){ 
      Platform.runLater(() -> { 
       XYChart.Series<Number,String> currentSeries = null; 
       currentSeries = chart.getData().get(indexSerie.intValue()); 
       currentSeries.getData().set(index,new XYChart.Data<>(x,y)); 
      }); 
     } 
    } 

回答

1

考慮使用工廠方法代替public構造函數,泛型化的方法,您有:

import java.util.Arrays; 

import javafx.application.Platform; 
import javafx.collections.FXCollections; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.chart.Axis; 
import javafx.scene.chart.CategoryAxis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.ScatterChart; 


public class JFXPanelScatterChartNS<X,Y> extends JFXPanel { 
    private ScatterChart<X,Y> chart ; 

    private boolean withDragAndDrop = false ; 

    private JFXPanelScatterChartNS(Axis<X> xAxis, Axis<Y> yAxis) { 
     chart = new ScatterChart<>(xAxis, yAxis); 
     Platform.runLater(() -> createScene(withDragAndDrop)); 
    } 

    private void createScene(boolean withDragAndDrop) { 
     // ... 
    } 

    public static JFXPanelScatterChartNS<String, String> createStringInstance(String[] xAxisCategories, String[] yAxisCategories) { 
     Axis<String> xAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(xAxisCategories))); 
     Axis<String> yAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(yAxisCategories))); 
     return new JFXPanelScatterChartNS<>(xAxisCategory, yAxisCategory); 
    } 

    public static JFXPanelScatterChartNS<String, Number> createStringNumberInstance(String[] xAxisCategories) { 
     Axis<String> xAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(xAxisCategories))); 
     return new JFXPanelScatterChartNS<String, Number>(xAxisCategory, new NumberAxis(0.0,10.0,1.0)); 
    } 

    public static JFXPanelScatterChartNS<Number, String> createNumberStringInstance(String[] yAxisCategories) { 
     Axis<String> yAxisCategory = new CategoryAxis(FXCollections.observableList(Arrays.asList(yAxisCategories))); 
     return new JFXPanelScatterChartNS<Number, String>(new NumberAxis(0.0,10.0,1.0), yAxisCategory); 
    } 

    public static JFXPanelScatterChartNS<Number, Number> createNumberInstance() { 
     return new JFXPanelScatterChartNS<Number, Number>(new NumberAxis(0.0,10.0,1.0), new NumberAxis(0.0,10.0,1.0));   
    } 

    public void addSeries(String idSeries, String nameSeries, final X xIni, final Y yIni){   
     final XYChart.Series<X,Y> newSeries; 
     //Valido si el Id ya existe 
     final boolean seriesExist = seriesMap.containsKey(idSeries); 
     //si no existe el ID entonces creo la nueva serie 
     if(!seriesExist){ 
      newSeries = new XYChart.Series<>(); 
      ObservableList<XYChart.Data<X, Y>> listaSerie; 
      listaSerie = FXCollections.synchronizedObservableList(FXCollections.observableList(new ArrayList<XYChart.Data<X, Y>>())); 
      newSeries.setData(listaSerie); 
      newSeries.setName(nameSeries); 
      newSeries.getData().add(new XYChart.Data<>(xIni,yIni)); 

      Platform.runLater(() -> { 
       //Genero el index para la nueva serie 
       Integer newIndex = new Integer(chart.getData().size()); 
       chart.getData().add(newIndex.intValue(), newSeries); 

       seriesMap.put(idSeries, newIndex); 
      }); 
     } 
    } 

    public void setData(final String idSeries, final int index, final X x, final Y y){ 
     //valido que exista la serie 
     boolean seriesExist = seriesMap.containsKey(idSeries); 
     //obtengo el index de la serie, como fue almacenada en la grafica 
     Integer indexSerie = seriesMap.get(idSeries); 
     if(seriesExist){ 
      Platform.runLater(() -> { 
       XYChart.Series<X,Y> currentSeries = null; 
       currentSeries = chart.getData().get(indexSerie.intValue()); 
       currentSeries.getData().set(index,new XYChart.Data<>(x,y)); 
      }); 
     } 
    } 
} 

現在,您可以編寫代碼,如:

JFXPanelScatterChartNS<Number, String> chart = 
    JFXPanelScatterChartNS.createNumberStringInstance(new String[] {"A", "B", "C"}); 
chart.addSeries("Series1", "Series 1", 1, "A"); 

JFXPanelScatterChartNS<Number, Number> numberChart = 
    JFXPanelScatterChartNS.createNumberInstance(); 
numberChart.addSeries("Series2", "Series 2", 5, 3); 
+0

謝謝@James_D。現在我該如何使用操作同一個類中的數據的方法?示例:查看下面的回覆: – Raul 2015-04-05 23:28:32

+0

我修改了問題並添加了方法 – Raul 2015-04-05 23:37:00

+0

你是最棒的!!你能幫助我與URL中的其他問題[鏈接](http://stackoverflow.com/questions/29463467/how-to-draw-a-line-from-the-point-to-x-axis-in-在-JavaFX的scatterchart)。我想通過圖像更改ScatterChart中的符號,但是我沒有在Web中找到解決方案。 – Raul 2015-04-06 00:30:08