The purpose of the program is to display chart on click of the button with given parameters.
JavaScript
x
calcButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//some calculations ...
XYChart chart = QuickChart.getChart("Graph", "X", "Y", "y(x)", expression.xData, expression.yData);
new SwingWrapper(chart).displayChart();
}
});
However displayChart uses invokeAndWait, which cannot be executed inside ActionListener which makes sense. What is the proper way to solve this issue?
I am using swing with XChart library
Advertisement
Answer
You have to create the frame and its content panel by yourself, note that using multiple frames in an application is in general a bad idea, so consider a different design for your UI (e.g. tabbed pane).
Sample code, only displayChart(...)
is relevant for you but I always prefer to create a runnable example:
JavaScript
package test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import org.knowm.xchart.QuickChart;
import org.knowm.xchart.XChartPanel;
import org.knowm.xchart.XYChart;
public class TestChart {
public static void main(String[] args) {
double[] xData=new double[100];
double[] yData=new double[100];
for (int i=0;i<100;i++) {
yData[i]=i+1;
xData[i]=Math.log(i+1);
}
XYChart chart = QuickChart.getChart("Graph", "X", "Y", "y(x)", xData, yData);
JFrame frame=new JFrame("Main");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton clickMe=new JButton("Click me!");
clickMe.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
displayChart(frame, chart);
}
});
frame.setContentPane(clickMe);
frame.pack();
frame.setVisible(true);
}
public static void displayChart(JFrame owner, XYChart chart) {
XChartPanel<XYChart> panel=new XChartPanel<XYChart>(chart);
JDialog d=new JDialog(owner, "Chart");
d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
d.setContentPane(panel);
d.pack();
d.setLocationRelativeTo(owner);
d.setVisible(true);
}
}