从JButton启动时,Jframe会动态停止更新

时间:2013-12-15 22:10:50

标签: java swing jframe

我想分享一下我遇到的问题,看看是否有人有任何想法。让我解释一下。

我创建了一个相当复杂的图表,可以根据下面的代码片段在运行时动态更新。

主页内的

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执行时会遇到这种不同的行为?

0 个答案:

没有答案