2012-07-18 33 views
1

我想出口通过点击鼠标左键图(.txt或将该.cvs)数据绘制,突出显示它,然后单击鼠标右键打开弹出然后一个文件选择对话框来保存数据JavaFX 2.x:如何突出显示图表上的绘图数据?

这里是一个画面例子

enter image description here

,这里是一个示例代码

public class BaseXYChart extends Application { 

@Override 
public void start(Stage stage) { 
    stage.setTitle("Linear plot"); 

    final CategoryAxis xAxis = new CategoryAxis(); 
    final NumberAxis yAxis = new NumberAxis(0, 22, 0.5); 

    yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis){ 
     @Override 
    public String toString(Number object){ 
     return String.format("%7.2f", object); 
    } 
}); 
final LineChart<String, Number>lineChart = new LineChart<String, Number>(xAxis, yAxis); 

    lineChart.setCreateSymbols(false); 
    lineChart.setAlternativeRowFillVisible(false); 
    lineChart.setLegendVisible(false); 

    XYChart.Series series1 = new XYChart.Series(); 

    series1.getData().add(new XYChart.Data("Jan", 1)); 
    series1.getData().add(new XYChart.Data("Feb", 1.5)); 
    series1.getData().add(new XYChart.Data("Mar", 2)); 
    series1.getData().add(new XYChart.Data("Apr", 2.5)); 
    series1.getData().add(new XYChart.Data("May", 3)); 
    series1.getData().add(new XYChart.Data("Jun", 4)); 
    series1.getData().add(new XYChart.Data("Jul", 6)); 
    series1.getData().add(new XYChart.Data("Aug", 9)); 
    series1.getData().add(new XYChart.Data("Sep", 12)); 
    series1.getData().add(new XYChart.Data("Oct", 15)); 
    series1.getData().add(new XYChart.Data("Nov", 20)); 
    series1.getData().add(new XYChart.Data("Dec", 22)); 

    BorderPane pane = new BorderPane(); 
    pane.setCenter(lineChart);   
    Scene scene = new Scene(pane, 800, 600); 
    lineChart.getData().addAll(series1); 

    stage.setScene(scene); 
    stage.show(); 
} 

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

}

我的问题是如何选择绘制的线数据,然后打开弹出窗口。

谢谢

回答

2

检查下面你的修改后的代码。

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Cursor; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.chart.CategoryAxis; 
import javafx.scene.chart.LineChart; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class BaseXYChart extends Application { 

    private DropShadow ds = new DropShadow(); 

    private ContextMenu contextMenu; 

    private XYChart.Series selectedSeries; 

    @Override 
    public void start(Stage stage) { 
     stage.setTitle("Linear plot"); 

     final CategoryAxis xAxis = new CategoryAxis(); 
     final NumberAxis yAxis = new NumberAxis(0, 22, 0.5); 

     yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 

      @Override 
      public String toString(Number object) { 
       return String.format("%7.2f", object); 
      } 
     }); 
     final LineChart<String, Number> lineChart = new LineChart<String, Number>(xAxis, yAxis); 

     lineChart.setCreateSymbols(false); 
     lineChart.setAlternativeRowFillVisible(false); 
     lineChart.setLegendVisible(false); 

     final XYChart.Series series1 = new XYChart.Series(); 

     series1.getData().add(new XYChart.Data("Jan", 1)); 
     series1.getData().add(new XYChart.Data("Feb", 1.5)); 
     series1.getData().add(new XYChart.Data("Mar", 2)); 
     series1.getData().add(new XYChart.Data("Apr", 2.5)); 
     series1.getData().add(new XYChart.Data("May", 3)); 
     series1.getData().add(new XYChart.Data("Jun", 4)); 
     series1.getData().add(new XYChart.Data("Jul", 6)); 
     series1.getData().add(new XYChart.Data("Aug", 9)); 
     series1.getData().add(new XYChart.Data("Sep", 12)); 
     series1.getData().add(new XYChart.Data("Oct", 15)); 
     series1.getData().add(new XYChart.Data("Nov", 20)); 
     series1.getData().add(new XYChart.Data("Dec", 22)); 

     BorderPane pane = new BorderPane(); 
     pane.setCenter(lineChart); 
     Scene scene = new Scene(pane, 800, 600); 
     lineChart.getData().addAll(series1); 

     contextMenu = new ContextMenu(); 
     MenuItem menuItem = new MenuItem("Save data"); 
     contextMenu.getItems().add(menuItem); 
     menuItem.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent arg0) { 
       if (selectedSeries != null) { 
        System.out.println("Save data of " + selectedSeries.getData()); 
        // Saving logic here 
       } 
      } 
     }); 

     // for every series in linechart 
     applyMouseEvents(series1); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    private void applyMouseEvents(final XYChart.Series series) { 

     final Node node = series.getNode(); 

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

      @Override 
      public void handle(MouseEvent arg0) { 
       node.setEffect(ds); 
       node.setCursor(Cursor.HAND); 
      } 
     }); 

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

      @Override 
      public void handle(MouseEvent arg0) { 
       node.setEffect(null); 
       node.setCursor(Cursor.DEFAULT); 
      } 
     }); 

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

      @Override 
      public void handle(MouseEvent mouseEvent) { 
       if (mouseEvent.getButton().equals(MouseButton.SECONDARY)) { 
        contextMenu.show(node, mouseEvent.getScreenX() + 1, mouseEvent.getScreenY() + 1); 
        // Set as selected 
        selectedSeries = series; 
        System.out.println("Selected Series data " + selectedSeries.getData()); 
       } 
      } 
     }); 
    } 

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

我最好的祝福Uluk,你的代码真的很棒! 非常感谢你! – 2012-07-18 10:49:55

+0

不客气。略微重构了代码。 – 2012-07-18 11:14:53

+0

最后一个问题:如何将Y轴设置为对数?我还没有回复我以前的帖子 http://stackoverflow.com/questions/10751894/javafx-xychart-logarithmic-plot – 2012-07-18 11:27:51