【发布时间】:2017-03-02 23:57:28
【问题描述】:
我有一个将JPanel 扩展为JFreeChart 的类。在setMean() 内部,我尝试更新dataset 或仅更新Function2D 的值,但即使使用repaint(),图表上也没有任何变化。
public class JFreeChartPanel extends JPanel {
Function2D normal = new NormalDistributionFunction2D(0.0, 3.0);
XYDataset dataset = DatasetUtilities.sampleFunction2D(normal, -5.0, 5.0, 100, "Normal");
double mean = 0.0, std = 1.0;
public double getMean() {
return mean;
}
public void setMean(double mean) {
this.mean = mean;
normal = new NormalDistributionFunction2D(mean,std);
dataset = DatasetUtilities.sampleFunction2D(normal, -5.0, 5.0, 100, "Normal");
repaint();
}
public double getStd() {
return std;
}
public void setStd(double std) {
this.std = std;
}
public JFreeChartPanel(){
JFreeChart chart = ChartFactory.createXYLineChart(
"Normal Distribution",
"X",
"Y",
dataset,
PlotOrientation.VERTICAL,
true,
true,
false
);
final ChartPanel chartPanel = new ChartPanel(chart);
setLayout(new BorderLayout());
add(chartPanel);
}
}
每次我更改 JTextField 中的值时都会执行此操作。
public void updateMean()
{
String meanS = mean.getText();
double mean = 0.0;
try{
mean = Double.parseDouble(meanS);
System.out.println("Mean: "+mean);
jFreeChartPanel.setMean(mean);
}catch(Exception e){
System.out.println("Mean: incorrect input");
}
}
【问题讨论】:
-
您更改了 dataset 保存的值,但您从未更改过 JFreeChart 图表,它不会自行神奇地改变。我不使用 JFreeChart,但您必须检查 API 以查看是否可以在显示的图表上调用方法,或者是否必须使用新数据创建新方法。
-
@HovercraftFullOfEels 据我所知,JFreeChart 有大量的侦听器,因此任何更改都应自动反映在图表上。
-
你不了解监听器是如何工作的——你必须设置它们,连接它们以使它们起作用。是的,您使用数据集对象创建了一个 JFreeChart 对象,但同样,稍后简单地更改数据集不会对 JFreeChart 对象产生影响。 JFreeChart 对象有一个模型,如果这个模型有侦听器,并且您使用适当的设置器方法更改模型,这些方法会使侦听器绊倒,我可以理解您的期望,但您不知道。您正在创建一个全新的数据集对象,因此无法想象它可以像您认为的那样工作。
-
例如,假设 XYDataset 对象作为其模型连接到 JFreeChart 对象中(同样,我不使用 JFreeChart,因此可能不是这样,但只是假设它是),那么也许调用改变其状态的方法可能会起作用,但是再次您正在创建一个全新的 XYDataset 对象,因此即使它作为侦听器连接,您的新对象也不会导致JFreeChart 对象中的任何更改。
-
@HovercraftFullOfEels 关于替换数据集是正确的,正如below所建议的那样。
标签: java swing events jpanel jfreechart