How to update/refresh JPanel on JButton click?
Asked Answered
P

1

6

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.

}
Pinter answered 13/4, 2015 at 18:29 Comment(1)
"I got 2 problem:" Given they are two fairly different problems, they're best dealt with on two question threads. SO is a Q&A Site, rather than a help desk.Statolith
T
7

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();
    }
});
Thurmond answered 13/4, 2015 at 18:33 Comment(2)
thank you! Now, chart displays when i click jbutton, but it doesn't change when i change the jtext value. Instead of changing, it displays two graphs.Pinter
You've got to add a (Document)listener to your JTextField, then update your chart when it changes, and then repaint(). It seems though if you are seeing two graphs, your problem is that you are adding another Graph to the panelThurmond

© 2022 - 2024 — McMap. All rights reserved.