How to update/refresh JPanel on JButton click?

Ranjeet picture Ranjeet · Apr 13, 2015 · Viewed 8.7k times · Source

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:

  1. The chart becomes visible after resizing the window and
  2. the chart doesn't refresh when I change the text field value.

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.

}

Answer

ControlAltDel picture ControlAltDel · Apr 13, 2015

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();
    }
});