2017-08-24 3 views
0

私はJavaFXのArea Chartで作業しています。ユーザーがテキストフィールドに値を入力して[追加]ボタンを押すと、シリーズを動的に追加したいと思います。私はまたそれに削除と元に戻す機能を追加したい。削除機能は、たとえば、エリアグラフ上に複数の行がある場合、各行は系列を表し、ユーザーはその行をクリックしてから削除ボタンをクリックして任意の行を削除できます。私はまた、ユーザーが彼の行動を元に戻すことができるように、元に戻す機能を追加したい。JavaFX:Areaal Chartでダイナミックにserveralシリーズを追加し、グラフからライン(シリーズ)を削除するにはどうすればよいですか?

インタフェースは、このようなものです。例えば、ユーザーのために

enter image description here

テキストフィールドを充填することによって、このような線を引くことができます。

enter image description here

enter image description here

今すぐましょうユーザーは赤い色のシリーズを削除したいと思っていますそれは、このような赤いシリーズを削除します]ボタンを削除するには、それをクリックした後、クリックしてください:

enter image description here

は、これまでのところ私はこの試みた:

import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.scene.Node; 
import javafx.scene.chart.AreaChart; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.scene.control.TextField; 
import javafx.scene.input.MouseEvent; 

public class SampleController { 


    @FXML 
    private NumberAxis xAxis; 
    @FXML 
    private NumberAxis yAxis; 
    @FXML 
    private AreaChart<Number, Number> areaChart; 
    @FXML 
    private TextField txtSt; 
    @FXML 
    private TextField txtEt; 
    @FXML 
    private TextField txtNb; 


    public void initialize() { 

      areaChart.setTitle("Chronos"); 
      xAxis.setLabel("Heures"); 
      yAxis.setLabel("Employés"); 

    } 


     //Button add functionality 
     @FXML 
     private void generateGraph() { 

      //double start = Double.parseDouble(txtSt.getText()); 
      double end = Double.parseDouble(txtEt.getText()); 
      int numberEmployees = Integer.parseInt(txtNb.getText()); 

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

      for (double start = Double.parseDouble(txtSt.getText()); start<=end; start++) { 
       series.getData().add(new XYChart.Data<Number, Number>(start, numberEmployees)); 
      } 


      // Add Series to AreaChart. 
      areaChart.getData().add(series); 

      //Mouse click even for series 
      setOnMouseEventsOnSeries(series.getNode(), 
        areaChart, "Series is clicked"); 
     } 


     private void setOnMouseEventsOnSeries(Node node, 
       final AreaChart chart, final String label) { 

      node.setOnMouseClicked(new EventHandler<MouseEvent>() { 

       @Override 
       public void handle(MouseEvent t) { 
        chart.setTitle(label); 
       } 
      }); 

     } 
} 

FXMLファイル:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.chart.AreaChart?> 
<?import javafx.scene.chart.NumberAxis?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.layout.VBox?> 

<VBox alignment="CENTER" prefHeight="800.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"> 
    <children> 
     <AreaChart fx:id="areaChart" prefHeight="799.0" prefWidth="800.0" VBox.vgrow="ALWAYS"> 
     <xAxis> 
      <NumberAxis autoRanging="false" minorTickCount="1" minorTickLength="1.0" side="BOTTOM" tickLabelGap="1.0" tickLength="1.0" tickUnit="1.0" upperBound="24.0" fx:id="xAxis" /> 
     </xAxis> 
     <yAxis> 
      <NumberAxis fx:id="yAxis" autoRanging="false" minorTickLength="1.0" side="LEFT" tickLabelGap="1.0" tickUnit="1.0" upperBound="10.0" /> 
     </yAxis> 
     </AreaChart> 
     <HBox alignment="CENTER" prefHeight="193.0" prefWidth="800.0"> 
     <children> 
      <TextField fx:id="txtSt" promptText="Start Value" /> 
      <TextField fx:id="txtEt" promptText="End Value" /> 
      <TextField fx:id="txtNb" promptText="Number of Employees" /> 
     </children> 
     </HBox> 
     <HBox alignment="CENTER" prefHeight="71.0" prefWidth="800.0"> 
     <children> 
      <Button mnemonicParsing="false" onAction="#generateGraph" prefHeight="31.0" prefWidth="137.0" text="Add" /> 
      <Button layoutX="342.0" layoutY="12.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="137.0" text="Delete" /> 
      <Button layoutX="410.0" layoutY="12.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="137.0" text="Undo" /> 
     </children> 
     </HBox> 
    </children> 
</VBox> 

私はこれらの機能をどのように達成できるか教えてください。

+0

FXMLファイルを追加します。 – Sedrick

+0

@SedrickJefferson質問が更新されました – Junaid

+0

こんにちは@Junaid申し訳ありません。 しかし、あなたはセドリックから良い答えがあるようです。 :) – Yahya

答えて

0

これは、開始に役立ちます。私はArrayListを追加してSeriesに追いついてChartに追加しました。コメントはコード内にあります。 ArrayListおよび/またはChartからアイテムを削除/削除する方法、またはArrayListからアイテムを削除する方法を確認してから、Chartを更新してください。

import java.net.URL; 
import java.util.ArrayList; 
import java.util.ResourceBundle; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.Node; 
import javafx.scene.chart.AreaChart; 
import javafx.scene.chart.XYChart; 
import javafx.scene.control.TextField; 
import javafx.scene.input.MouseEvent; 

/** 
* 
* @author blj0011 
*/ 
public class FXMLDocumentController implements Initializable { 

// @FXML 
// private NumberAxis xAxis; 
// @FXML 
// private NumberAxis yAxis; 
    @FXML 
    private AreaChart<Number, Number> areaChart; 
    @FXML 
    private TextField txtSt; 
    @FXML 
    private TextField txtEt; 
    @FXML 
    private TextField txtNb; 


    ArrayList<XYChart.Series<Number, Number>> seriesContainer = new ArrayList();//Use an ArrayList to hold new Series! 


     //Button add functionality 
     @FXML 
     private void generateGraph() { 

      Double start = Double.parseDouble(txtSt.getText()); 

      Double end = Double.parseDouble(txtEt.getText()); 
      double numberEmployees = Integer.parseInt(txtNb.getText()); 

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

      for (int i = start.intValue(); i <= end.intValue(); i++) { 
       series.getData().add(new XYChart.Data(i, numberEmployees)); 
      } 


      // Add Series to series container. 
      seriesContainer.add(series); 

      //Add only new series to AreaChart 
      for(XYChart.Series<Number, Number> entry : seriesContainer) 
      { 
       if(!areaChart.getData().contains(entry)) 
       {      
        areaChart.getData().add(entry); 
       } 
      } 
     } 

     private void setOnMouseEventsOnSeries(Node node, 
       final AreaChart chart, final String label) { 

      node.setOnMouseClicked(new EventHandler<MouseEvent>() { 

       @Override 
       public void handle(MouseEvent t) { 
        chart.setTitle(label); 
       } 
      }); 

     } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     areaChart.setTitle("Chronos"); 
     areaChart.getXAxis().setLabel("Heures"); 
     areaChart.getYAxis().setLabel("Employés"); 
    } 
} 
+0

ありがとう@セドリックはそれを得た。もう1つのことは、シリーズのそれぞれをどのように埋めることができ、X座標(最初の値と最後の値)とY座標値を得ることができるか教えてください。これは、一連の値をそれぞれdbに格納する必要があるために必要です。 – Junaid

+0

スレッドごとに1つの質問のみ。新しい問題を解決するために真剣な試みをする必要があります。その後、新しい質問を開く必要があります。 – Sedrick

+0

これまでに試したことで新しい質問を投稿します。 – Junaid

関連する問題