I am trying to plot a graph and graph should display when JButton
is clicked. To create data set, I am taking some value through JTextField
and then created a chart and plotted it. I've got 2 problems:
Here is my program:
public class Test extends JFrame {
private JPanel contentPane;
private JTextField textField;
private ChartPanel chartPanel;
public Test() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.WEST);
panel.setLayout(new MigLayout("", "[][grow]", "[][][][][]"));
JLabel lblA = new JLabel("a");
panel.add(lblA, "cell 0 2,alignx trailing");
textField = new JTextField();
panel.add(textField, "cell 1 2,growx");
textField.setColumns(10);
JButton btn = new JButton("Plot");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
double a= Double.parseDouble(textField.getText());
chartPanel = createChart(a);
contentPane.add(chartPanel, BorderLayout.CENTER);
}
});
panel.add(btn, "cell 1 4");
}
// Create ChartPanel
private ChartPanel createChart(double a) {
XYDataset dataset = createDataset(a);
JFreeChart chart = ChartFactory.createXYLineChart("title", "X", "Y",
dataset, PlotOrientation.VERTICAL, true, true, false);
return new ChartPanel(chart);
}
// Create Dataset
private XYDataset createDataset(double a) {
int x[] = { 1, 2, 3, 4, 5 };
int y[] = { 1, 4, 9, 16, 25 };
XYSeries s1 = new XYSeries("test");
for (int i = 0; i < y.length; i++) {
s1.add(a*x[i], y[i]);
}
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(s1);
return dataset;
}
//Main Mathed: skipped.
}
When you add a new Component to a Container that is currently showing, you must revalidate and repaint the Container
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
double a= Double.parseDouble(textField.getText());
chartPanel = createChart(a);
contentPane.add(chartPanel, BorderLayout.CENTER);
//You have added a new component. The contentPane will be invalid, and needs repainting
contentPane.validate();
contentPane.repaint();
}
});