如何在JButton上更新/刷新JPanel?

时间:2015-04-13 18:29:33

标签: java swing jfreechart layout-manager miglayout

我正在尝试绘制图表,并且在点击JButton时应显示图表。要创建数据集,我通过JTextField获取一些值,然后创建一个图表并绘制它。我有两个问题:

  1. 调整窗口大小后,图表变为可见
  2. 更改文本字段值时,图表不会刷新。
  3. 这是我的计划:

    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.
    
    }
    

1 个答案:

答案 0 :(得分:2)

将新组件添加到当前显示的Container时,必须重新验证并重新绘制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();
    }
});