我想分享一下我遇到的问题,看看是否有人有任何想法。让我解释一下。
我创建了一个相当复杂的图表,可以根据下面的代码片段在运行时动态更新。
主页内的:
if(singleRun){
try{
FileInputStream fin = new FileInputStream("C:\\eclipse\\data\\so.gad");
ObjectInputStream ois = new ObjectInputStream(fin);
SO = (GAStatisticObject) ois.readObject();
ois.close();
}
catch(FileNotFoundException FNFE){System.out.println("file not found"); System.exit(1);}
catch(ClassNotFoundException CNFE){System.out.println("class not found");System.exit(1);}
catch(IOException IOE){System.out.println("error during data save: "); IOE.printStackTrace
();System.exit(1);}
GenotypeSimulator GS = new GenotypeSimulator(SO, populationSize); //statistic object, population size, enable immediately
GS.simulateEvolution();
}
基本上,从和目标文件中读取数据 创建一个新的模拟引擎(反过来创建GUI和图表) 然后开始模拟,基本上一次读取一个数据点的数据文件并更新图形。 (模拟器的代码如下)
public void simulateEvolution(){
for(int x=0; x<genNumberSolutionFound; x++){
//System.out.println("updating data. GEN # = " + (x+1));
//if(x!=0){
try {Thread.sleep(1000);}
catch (InterruptedException e) {e.printStackTrace();}
//}
//data series 1
XYDataItem point1 = null;
if(x<genNumberSolutionFound-1){//parent vector is always 1 less in length then the rest
point1 = new XYDataItem(new Double(x+1), new Double(selectedFitnessAvg.get(x))); //parent select avg fitness
}
XYDataItem point2 = new XYDataItem(new Double(x+1), new Double(populationFitnessAvg.get(x))); //avg fitness
XYDataItem point3 = new XYDataItem(new Double(x+1), new Double(populationSmallestFitness.get(x))); //low fitness
XYDataItem point4 = new XYDataItem(new Double(x+1), new Double(populationLargestFitness.get(x))); //high fitness
//data series 2
XYDataItem point5 = new XYDataItem(new Double(x+1), new Double(cumulativeAllelDistributionVector.get(x))); //diversity
Vector<XYDataItem> DI = new Vector<XYDataItem>();
DI.add(point1); //parent avg fitness
DI.add(point2); //avg fitness
DI.add(point3); //low fitness
DI.add(point4); //high fitness
DI.add(point5); //average diversity
LGP.updateAllDataSeries(DI, new Integer(sizeOfPopulation*(x+1)));
BGP.updateDataSet(x+1, instantaneousAllelDistributionMatrix.get(x));
}
BGP.setGARunComplete();
}
(注意我添加了一个睡眠定时器,只是为了让更新速度慢一些)
这很棒!
现在问题就出现了。我真正想要做的是当我点击JButton而不是直接从我的main函数点击时,我想从另一个JFrame开始模拟。所以我创建了一个新的“执行控制面板”,当你点击开始按钮时,它执行的事件处理程序中先前显示的代码完全相同。
但是,我得到的只是一个空白的窗口,不再像以前那样动态更新。我知道模拟运行正常,因为我仍然看到println到StdOut,但GUI保持空白,直到“evolveSolution()”方法完成,然后立即更新。
任何人都知道为什么我从另一个GUI执行时会遇到这种不同的行为?