2017-06-21 93 views
-1

我正在開發我的第一個Java項目,一個模擬中性粒細胞捕獲細菌的行爲(所以隨機/半隨機粒子行爲)。在這個程序的開始,我有幾個變量(比如生物體的半徑等),現在它們被固定爲硬編碼的值。我想要創建一個用戶界面,以便在程序啓動之前彈出一個屏幕,您可以在其中鍵入要使用的值,然後使用這些值運行編程。現在,我已經使用了一個擺動腳本來創建這樣一個窗口,看起來有點像這樣:如何創建一個簡單的用戶界面來聲明變量?

enter image description here

現在我想知道我怎麼能實現它,這樣我可以在這些文本中使用的值並將它們分配給我的程序中的變量。 這就是我所指的程序:

package nanocourse; 

import java.awt.Color; 
import nano.*; 
import java.util.Random; 
import prescreen.PreScreen; 

public class Exercise3_final { 

    public Exercise3_final() { 

     int xSize = 1000; 
     int ySize = 800; 
     Canvas myScreen = new Canvas(xSize, ySize); 
     Pen myPen = new Pen(myScreen); 
     Random random = new Random(); 
     int frame=0; //how many frames have passed since start program 

     //properties bacterium 
     int xPosBacterium=random.nextInt(xSize); //random starting position of bacterium 
     int yPosBacterium=random.nextInt(ySize); 
     int K=1000; //how many points used to draw bacterium 
     double [] xValueBacterium = new double[K]; // 
     double [] yValueBacterium = new double[K]; 
     double bacteriumRadiusInput=20; 
     double bacteriumRadius=bacteriumRadiusInput; //radius of bacterium 
     boolean bacteriumAlive=true; 

     //properties biomolecules 
     int amountBio=30000; 
     boolean [] bioExist = new boolean[amountBio]; 
     int [] xPosBio = new int [amountBio]; 
     int [] yPosBio = new int [amountBio]; 
     int [] dXBio = new int [amountBio]; 
     int [] dYBio = new int [amountBio]; 
     int [] lifetimeBio = new int [amountBio]; 
     double chanceDegrade=0.1; //chance that a biomolecule gets degraded per frame 
     double chanceSynthesize=100; //chance that a biomolecule gets synthesized per frame 
     for(int i=0;i<amountBio;i++) 
     { 
      bioExist[i]=false; //setting existing state to false 
     } 

     //properties Neutrophil 
     int xPosNeutrophil=random.nextInt(xSize); 
     int yPosNeutrophil=random.nextInt(ySize); 
     int L=1000; 
     double [] xValueNeutrophil= new double[L]; 
     double [] yValueNeutrophil= new double[L]; 
     double neutrophilRadius=40; 

     double xVector, yVector, xNormVector,yNormVector,magnitude,xSumVector,ySumVector; 
     double aggressiveness=1; 

     while(bacteriumAlive==true) //while program is running 
      { 
       frame++; 
       //1. Simulating a moving Bacterium 

       int dXBacterium=random.nextInt(11)-5; //random motion 
       int dYBacterium=random.nextInt(11)-5; 
       xPosBacterium=xPosBacterium+dXBacterium; 
       yPosBacterium=yPosBacterium+dYBacterium; 

       if(xPosBacterium<(bacteriumRadius/2+2*myPen.getSize())) //boundaries bacterium,accounting for size bacterium 
       { 
        xPosBacterium=(int)bacteriumRadius/2+2*myPen.getSize(); 
       } 
       else if(xPosBacterium>xSize - (bacteriumRadius/2+2*myPen.getSize())) 
       { 
        xPosBacterium=xSize - ((int)bacteriumRadius/2+2*myPen.getSize()); 
       } 
       else if(yPosBacterium<(bacteriumRadius/2+2*myPen.getSize())) 
       { 
        yPosBacterium=((int)bacteriumRadius/2+2*myPen.getSize()); 
       } 
       else if(yPosBacterium>ySize - (bacteriumRadius/2+2*myPen.getSize())) 
       { 
        yPosBacterium=ySize - ((int)bacteriumRadius/2+2*myPen.getSize()); 
       } 



       //2. Simulating synthesis and secretion of biomolecules by the bacterium. 
       for(int i=0;i<amountBio;i++) 
       {  
        double synthesizeNumber=Math.random()*100; 
         if(synthesizeNumber<chanceSynthesize && i==frame) 
         { 
          bioExist[frame]=true; //make the biomolecules exist 
         } 


        if(bioExist[i]==true && frame!=1) //if biomolecule exist apply motion 
        { 
         dXBio[i]=random.nextInt(41)-20; 
         dYBio[i]=random.nextInt(41)-20; 
         xPosBio[i]=xPosBio[i]+dXBio[i]; 
         yPosBio[i]=yPosBio[i]+dYBio[i]; 
        } 
        else //if biomolecule doesn't exist, make position equal bacterium position 
        { 
         xPosBio[i]=xPosBacterium; 
         yPosBio[i]=yPosBacterium; 
        } 

        if(xPosBio[i]>xSize) //boundaries biomolecules 
        { 
         xPosBio[i]=xSize; 
        } 
        if(xPosBio[i]<0) 
        { 
         xPosBio[i]=0; 
        } 
        if(yPosBio[i]>ySize) 
        { 
         yPosBio[i]=ySize; 
        } 
        if(yPosBio[i]<0) 
        { 
         yPosBio[i]=0; 
        } 

        if(bioExist[i]==true) 
        { 
         lifetimeBio[i]++; 
         double degradationNumber=Math.random()*100; 
         if(degradationNumber<chanceDegrade) 
         { 
          bioExist[i]=false; 
         } 
        } 

        if(bioExist[i]==true && lifetimeBio[i]<=100) //if biomolecule lives shorter than 100 frames==>green 
        { 
         myPen.setColor(Color.GREEN); //drawing biomolecules 
         myPen.setShape(Shape.CIRCLE); 
         myPen.setSize(5); 
        } 
        if(bioExist[i]==true && (lifetimeBio[i]>100 && lifetimeBio[i]<=500)) //if biomolecule lives 101-500 frames==>green 
        { 
         myPen.setColor(Color.yellow); //drawing biomolecules 
         myPen.setShape(Shape.CIRCLE); 
         myPen.setSize(5); 
        } 
        if(bioExist[i]==true && (lifetimeBio[i]>500 && lifetimeBio[i]<=1000)) //if biomolecule lives 501-1000 frames==>orange 
        { 
         myPen.setColor(Color.ORANGE); //drawing biomolecules 
         myPen.setShape(Shape.CIRCLE); 
         myPen.setSize(5); 
        } 
        if(bioExist[i]==true && (lifetimeBio[i]>1000 && lifetimeBio[i]<=1500)) //if biomolecule lives 1001-1500 frames==>red 
        { 
         myPen.setColor(Color.RED); //drawing biomolecules 
         myPen.setShape(Shape.CIRCLE); 
         myPen.setSize(5); 
        } 
        if(bioExist[i]==true && lifetimeBio[i]>1500) //if biomolecule lives 2001+ frames==>magenta 
        { 
         myPen.setColor(Color.magenta); //drawing biomolecules 
         myPen.setShape(Shape.CIRCLE); 
         myPen.setSize(5); 
        } 
        if(bioExist[i]==true) 
        { 
         myPen.draw(xPosBio[i],yPosBio[i]); 
        } 
        if(Math.sqrt(Math.pow(Math.abs(xPosBio[i]-xPosNeutrophil),2)+Math.pow(Math.abs(yPosBio[i]-yPosNeutrophil), 2))<neutrophilRadius) 
        { 
         bioExist[i]=false; //degrade if inside neutrophil 
        } 
       } 
       if(bacteriumAlive==true) 
       { 
        for(int i = 0; i <K ; i++) //defining circle, drawing points, placed here because it needs to be on top 
        { 
         xValueBacterium[i] = bacteriumRadius*Math.cos(2*Math.PI*i/K); 
         yValueBacterium[i] = bacteriumRadius*Math.sin(2*Math.PI*i/K); 
         myPen.setColor(Color.red); 
         myPen.setShape(Shape.CIRCLE); 
         myPen.setSize(5); 
         myPen.draw((int)xValueBacterium[i]+xPosBacterium,(int)yValueBacterium[i]+yPosBacterium); 
        } 
       } 
       //5. Simulating the neutrophil eating the bacteriun 

       xSumVector=0; 
       ySumVector=0; 
       for(int i=0;i<amountBio;i++) 
       { 
        if(Math.abs(xPosBio[i]-xPosNeutrophil)<(30+neutrophilRadius) && Math.abs(yPosBio[i]-yPosNeutrophil)<(30+neutrophilRadius) && bioExist[i]==true) 
        { 
          xVector=xPosBio[i]-xPosNeutrophil; 
          yVector=yPosBio[i]-yPosNeutrophil; 
          magnitude=Math.sqrt(Math.pow(xVector, 2)+Math.pow(yVector, 2)); 
          xNormVector=xVector/magnitude; 
          yNormVector=yVector/magnitude; 
          xSumVector=xSumVector+xNormVector; 
          ySumVector=ySumVector+yNormVector; 

        } 
       } 

       //3. Simulating a moving neutrophil 
       int dXNeutrophil=random.nextInt(11)-5+(int)aggressiveness*(int)xSumVector; //random motion 
       int dYNeutrophil=random.nextInt(11)-5+(int)aggressiveness*(int)ySumVector; 
       xPosNeutrophil=xPosNeutrophil+dXNeutrophil; 
       yPosNeutrophil=yPosNeutrophil+dYNeutrophil; 

       myPen.setSize(8); 
       if(xPosNeutrophil<(neutrophilRadius/2+2*myPen.getSize())) //boundaries neutrophil 
       { 
        xPosNeutrophil=(int)neutrophilRadius/2+2*myPen.getSize(); 
       } 
       else if(xPosNeutrophil>xSize - (neutrophilRadius/2+2*myPen.getSize())) 
       { 
        xPosNeutrophil=xSize - ((int)neutrophilRadius/2+2*myPen.getSize()); 
       } 
       else if(yPosNeutrophil<(neutrophilRadius/2+2*myPen.getSize())) 
       { 
        yPosNeutrophil=((int)neutrophilRadius/2+2*myPen.getSize()); 
       } 
       else if(yPosNeutrophil>ySize - (neutrophilRadius/2+2*myPen.getSize())) 
       { 
        yPosNeutrophil=ySize - ((int)neutrophilRadius/2+2*myPen.getSize()); 
       } 
       for(int i = 0; i <L ; i++) //defining circle, drawing points, placed here because it needs to be on top 
       { 
        xValueNeutrophil[i] = neutrophilRadius*Math.cos(2*Math.PI*i/L); 
        yValueNeutrophil[i] = neutrophilRadius*Math.sin(2*Math.PI*i/L); 
        myPen.setColor(Color.blue); 
        myPen.setShape(Shape.CIRCLE); 
        myPen.draw((int)xValueNeutrophil[i]+xPosNeutrophil,(int)yValueNeutrophil[i]+yPosNeutrophil); 
       } 

       if(Math.abs(xPosNeutrophil-xPosBacterium)<2*bacteriumRadiusInput && Math.abs(yPosNeutrophil-yPosBacterium)<2*bacteriumRadiusInput && bacteriumRadius >=0) 
       { 
        bacteriumRadius=bacteriumRadius-1; 
        if(bacteriumRadius==0) 
        { 
         bacteriumAlive=false; 
        } 
       } 

       if(bacteriumAlive==false) 
       { 
        bacteriumAlive=true; 
        xPosBacterium=random.nextInt(xSize); //random starting position of bacterium 
        yPosBacterium=random.nextInt(ySize); 
        bacteriumRadius=bacteriumRadiusInput; 
       } 
       myScreen.update(); //updating/refreshing screen 
       myScreen.pause(10); 
       myScreen.clear(); 
      } 



    } 

    public static void main(String[] args) { 
     Exercise3_final e = new Exercise3_final(); 
    } 
} 

任何幫助,將不勝感激!

+0

我會做一個類,存儲所有這些參數的值。然後,UI可以根據字段的值實例化該類,並將生成的對象傳遞給計算引擎的一個方法。您需要使用您用於文本字段的類的getText()方法,以及Double類的parseDouble()靜態方法,也可能使用parseInt() Integer類的靜態方法。 –

+0

1)爲了更快地獲得更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 2)鑑於這些值似乎是數字,我建議使用帶有SpinnerNumberModel而不是文本字段的spinners('JSpinner')。保留對模型的引用,並使用'numberModel.getNumber.intValue()'作爲整數。數字模型可以有一個默認值,這意味着「使用默認設置」複選框變得多餘。在'Run!'按鈕上添加一個'ActionListener',當它激活時,關閉該屏幕,從模型中獲取數字並開始動畫。 –

回答

0

聽起來像你需要一個動作偵聽器的「運行!」從您的對話框按鈕:

_run.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    // set the variables here by getting the text from the inputs 
    field1Var = Integer.parseInt(field1Input.getText()); 
    field2Var = Integer.parseInt(field2Input.getText()); 
    ... 
    } 
}); 
0

我建議創建一個單獨的類來保存從第一屏幕(選項菜單屏幕)捕獲的所有值。 您可以稍後在應用程序的任何位置獲取此類的實例並使用它。 優勢在於: - 您不必在應用程序中的任何位置繼續使用值。 - 捕獲的值將持續到應用程序關閉。

注意:確保在從選項菜單中獲取值時添加驗證,以便不設置錯誤的值。

+1

請不要這樣做。 由於部分原因,請參閱https://blogs.msdn.microsoft.com/scottdensmore/2004/05/25/why-singletons-are-evil/和http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/ –

+0

雖然這些都是針對單例類的好點,但每個需求都不相同,並且可以使用java中的各種工具來實現。這裏的要求並不複雜,一個單獨的類在這裏不難處理。單例類的初始化應該與這裏的菜單鏈接。 – Swazzy

相關問題