Javafx 使用滑块更新SwingNode中的Jfreechart
我正在使用SwingNode将JFreeChart插入JavaFX应用程序。我能够使用数组绘制线图。我想用滑块值更新图表。我的意思是图表应该可以在图形区域中移动 这是我的控制器代码和绘制图形的代码 我没有任何例外,一切都正常执行,但我无法将滑块与图形连接起来。请帮我找出我犯的错误Javafx 使用滑块更新SwingNode中的Jfreechart,javafx,jfreechart,jslider,Javafx,Jfreechart,Jslider,我正在使用SwingNode将JFreeChart插入JavaFX应用程序。我能够使用数组绘制线图。我想用滑块值更新图表。我的意思是图表应该可以在图形区域中移动 这是我的控制器代码和绘制图形的代码 我没有任何例外,一切都正常执行,但我无法将滑块与图形连接起来。请帮我找出我犯的错误 public class FXMLController implements Initializable { @FXML private void open_btn_action(ActionEvent eve
public class FXMLController implements Initializable
{
@FXML
private void open_btn_action(ActionEvent event)
{
xArray = new double[]{0.0};
yArray = new double[]{0.0};
fc=new FileChooser();
fc.getExtensionFilters().addAll();
fc.getExtensionFilters().addAll(new ExtensionFilter("Text Files","*.txt"));
fc.getExtensionFilters().addAll(new ExtensionFilter("CSV Files","*.csv"));
file=fc.showOpenDialog(null);
if(file!=null)
{ //System.out.println(file.getAbsolutePath());
try
{
count = (int) Files.lines(file.toPath(), Charset.defaultCharset()).count();
}
catch (IOException ex)
{
Logger.getLogger(Data.class.getName()).log(Level.SEVERE, null, ex);
}
data = Data.getData(file,count);
xArray = new double[data.length];
yArray = new double[data.length];
xArray = Data.array_x_value(data);
yArray = Data.array_y_value(data);
chart = Chart.chart_plot(xArray,yArray);
final SwingNode chartSwingNode = new SwingNode();
final SwingNode sliderNode = new SwingNode();
chartSwingNode.setContent(new ChartPanel(chart));
final JSlider slider = new JSlider(0,xArray.length);
slider.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
final XYPlot plot = (XYPlot) chart.getPlot();
plot.setDataset(Chart.list.get(slider.getValue()));
System.out.println(slider.getValue());
}});
sliderNode.setContent(slider);
//Adding Chart to the splitPane and slider on the display
bPane.setCenter(chartSwingNode);
bPane.setBottom(sliderNode);
upperCount = xArray.length;
mainSplit.getItems().set(1,bPane);
}
}
}
//Chart Class to plot chart
public class Chart
{
static JFreeChart chart;
static double[] xValues,yValues;
static XYPlot plot;
static List<XYDataset> list = new ArrayList<XYDataset>();
public static JFreeChart chart_plot(double[] x,double[] y)
{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // for look and feel like a desktop application
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException e) { }
xValues=new double[x.length];
xValues=x;
yValues=new double[y.length];
yValues=y;
XYDataset dataset=createDataset(xValues,yValues);
chart = ChartFactory.createXYLineChart("","Wave number cm"+'\u2212'+'\u00B9',"Intensity",
dataset, PlotOrientation.VERTICAL,true, true, false);
chart.getPlot().setBackgroundPaint(new Color(235, 244, 250));
plot = (XYPlot)chart.getPlot();
final NumberAxis axis2 = (NumberAxis) plot.getRangeAxis();
//axis2.setLabelPaint(Color.magenta);
//axis2.setTickLabelPaint(Color.darkGray);
axis2.setAutoRange(true);
axis2.setAutoRangeIncludesZero(false);
plot.getRenderer().setSeriesPaint(0, new Color(10,11,45));
plot.getRenderer().setSeriesStroke(0,new BasicStroke(1.25f));
plot.setDomainPannable(false);
plot.setDomainGridlinePaint(new Color(0xC0,0xC0,0xC0));
plot.setRangeGridlinePaint(new Color(0xC0,0xC0,0xC0));
plot.setRangeZeroBaselineVisible(false);
plot.setDomainZeroBaselineVisible(false);
plot.setOutlineVisible(false);
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
//range.setRange(-MINMAX, MINMAX);
plot.configureRangeAxes();
plot.setDomainCrosshairVisible(true);
plot.setDomainCrosshairLockedOnData(true);
plot.setRangeCrosshairVisible(true);
//plot.setOutlinePaint(Color.gray);
//System.out.println(plot.isRangeZeroBaselineVisible());
XYLineAndShapeRenderer renderer =
(XYLineAndShapeRenderer) plot.getRenderer();
ChartListener.chartListner(chart);
//System.out.println("X length="+ xValues.length);
list = new ArrayList<XYDataset>();
for (int i = 0; i <= xValues.length; i++) {
list.add(getDataset(i));
}
return chart;
}
private static XYDataset getDataset(int n) {
final XYSeries series = new XYSeries("series1");
double values;
for (int length = 0; length < xValues.length; length++) {
values = xValues[length];
series.add(values, yValues[length]);
}
return new XYSeriesCollection(series);
}
public static XYDataset createDataset(double[] array_x,double[] array_y)
{
DefaultXYDataset ds = new DefaultXYDataset();
double[][] data={array_x,array_y};
ds.addSeries("series1", data);
return ds;
}
}
公共类FXMLController实现可初始化
{
@FXML
私有无效打开\u btn\u操作(ActionEvent事件)
{
xArray=newdouble[]{0.0};
yArray=新的双[]{0.0};
fc=新文件选择器();
fc.getExtensionFilters().addAll();
fc.getExtensionFilters().addAll(新的ExtensionFilter(“文本文件”,“*.txt”);
fc.getExtensionFilters().addAll(新的ExtensionFilter(“CSV文件”,“*.CSV”);
file=fc.showOpenDialog(null);
如果(文件!=null)
{//System.out.println(file.getAbsolutePath());
尝试
{
count=(int)Files.lines(file.toPath(),Charset.defaultCharset()).count();
}
捕获(IOEX异常)
{
Logger.getLogger(Data.class.getName()).log(Level.SEVERE,null,ex);
}
data=data.getData(文件,计数);
xArray=新的双精度[data.length];
yArray=新的双精度[data.length];
xArray=数据。数组×值(数据);
yArray=数据。数组_y_值(数据);
图表=图表。图表+绘图(xArray,yArray);
最终SwingNode chartSwingNode=新SwingNode();
最终SwingNode sliderNode=新SwingNode();
setContent(新的ChartPanel(图表));
最终JSlider滑块=新JSlider(0,xArray.length);
slider.addChangeListener(新的ChangeListener()
{
@凌驾
公共无效状态已更改(更改事件e)
{
最终XYPlot=(XYPlot)chart.getPlot();
plot.setDataset(Chart.list.get(slider.getValue());
System.out.println(slider.getValue());
}});
sliderNode.setContent(滑块);
//将图表添加到拆分窗格和屏幕上的滑块
设置中心(chartSwingNode);
b平面设置底部(滑块节点);
上限=xArray.length;
mainSplit.getItems().set(1,bPane);
}
}
}
//图表类来绘制图表
公共课程表
{
静态海图;
静态双[]X值,Y值;
静态XY图;
静态列表=新的ArrayList();
公共静态JFreeChart图表(双[]x,双[]y)
{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//用于类似桌面应用程序的外观
}catch(ClassNotFoundException | IllegalAccessException | instanceionexception | UnsupportedLookAndFeelException e){}
xValues=新的双精度[x.长度];
xvalue=x;
y值=新的双精度[y.长度];
y值=y;
XYDataset数据集=createDataset(xValues,yValues);
chart=ChartFactory.createXYLineChart(“,”波数cm“+”\u2212“+”\u00B9“,”强度“,
数据集,PlotOrientation.VERTICAL,true,true,false);
getPlot().setBackgroundPaint(新颜色(235244250));
plot=(XYPlot)chart.getPlot();
最终NumberAxis axis2=(NumberAxis)plot.getRangeAxis();
//axis2.setLabelPaint(颜色为洋红色);
//axis2.setTickLabelPaint(Color.darkGray);
axis2.setAutoRange(真);
axis2.SetAutoRangeIncludeZero(假);
plot.getRenderer().setSeriesPaint(0,新颜色(10,11,45));
plot.getRenderer().setSeriesStroke(0,新的基本行程(1.25f));
plot.setDomainPanable(false);
plot.setDomainGridlinePaint(新颜色(0xC0,0xC0,0xC0));
plot.setRangeGridlinePaint(新颜色(0xC0,0xC0,0xC0));
plot.setRangeZeroBaselineVisible(假);
plot.setDomainZeroBaselineVisible(false);
plot.setOutlineVisible(false);
ValueAxis域=plot.getDomainAxis();
domain.setAutoRange(true);
//range.setRange(-MINMAX,MINMAX);
plot.configureRangeAxes();
plot.setDomainCrosshairVisible(true);
plot.setDomainCrosshairLockedOnData(真);
plot.setRangeCrosshairVisible(真);
//plot.setOutlinePaint(颜色:灰色);
//System.out.println(plot.isRangeZeroBaselineVisible());
XylineandShaperEnder渲染器=
(XYLineAndShapeRenderer)plot.getRenderer();
ChartListener.chartListner(图表);
//System.out.println(“X length=“+xValues.length”);
列表=新的ArrayList();
对于(int i=0;我引用了这个。你在找一个吗?是的……谢谢,我能得到一些这样的例子吗?我创建了自己的SlidingXYDataset,它实现XYDataset的方式类似于SlidingCategoryDataset实现CategoryDataset的方式。但是它不起作用。请建议我怎么做?你尝试过引用的实现吗?