我正在尝试绘制图表,并且在点击JButton
时应显示图表。要创建数据集,我通过JTextField
获取一些值,然后创建一个图表并绘制它。我有两个问题:
这是我的计划:
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.
}
答案 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();
}
});