import java.awt.*; /** * This class visualizes the actual population of the GA. * * coding: h.sarg * modified: 01/98 */ public class PopCanvas extends java.awt.Canvas implements java.awt.event.MouseListener { private final int NR=20; private boolean fontSet= false; private Font f; private FontMetrics fm; private int fw, fh; private int popsize; private Population pop=null; private TripFrame[] trips=new TripFrame[NR]; private int framecount=0; private TravelData data; private boolean showtowns; private int largefonts; private int grid; private boolean drawnew = false; private Image buffered_image = null; private ScrollPane scroll=null; private String nrstring="Nr"; private String tripstring="Trip"; private String fitstring="Fitness"; /** * PopCanvas constructor comment. */ public PopCanvas() { super(); this.addMouseListener(this); } /** * sets the necessary data to draw this object * @param s pointer to the scrollpane * @param popsize populationsize * @param a object which contains the values of the towns * @param b indicates if the towns should be labeled or not * @param c indicates the font size * @param grid size */ public void setPopData(ScrollPane s, int popsize, TravelData a, boolean b, int c, int grid) { this.popsize = popsize; this.data=a; this.showtowns=b; this.largefonts=c; this.grid=grid; fontSet = false; scroll = s; //repaint(); } /** * sets the population to be drawn * @param pop population */ public void setPop(Population pop) { this.pop=pop; drawnew = true; repaint(); } /** * redefines the update method for faster double buffering * @param g java.awt.Graphics */ public void update(Graphics g) { paint(g); } /** * create the used font and measure his size * @param g java.awt.Graphics */ private void setFont(Graphics g) { if(fontSet) return; if(largefonts==1) { f = new Font("Monospaced",Font.PLAIN, 12); } if(largefonts==0) { f = new Font("Monospaced",Font.PLAIN, 11); } if(largefonts==2) { f = new Font("Monospaced",Font.PLAIN, 13); } fm =g.getFontMetrics(f); fw =fm.stringWidth("A"); fh =fm.getAscent(); fontSet=true; } /** * disposes all TripFrames and is called before the parent window is closed */ public void disposeFrames() { for(int i=0;i-1) { trips[index]=trips[i]; index+=1; } } else { if(index==-1) index=i; framecount--; state=true; } } System.out.println("showing:" + framecount+ "index= "+index+"\n"); return state; } /** * redefines the paint method, implements double buffering * @param a java.awt.Graphics */ public void paint(java.awt.Graphics g) { int i,j,x,y; if(drawnew) { if(pop!=null) { setFont(g); x=fm.stringWidth(pop.getIndiv(0).toPopString(true) )+3*fw; y=(1+popsize)*(fh+3)+fh+2; this.setSize(x, y); scroll.doLayout(); buffered_image = this.createImage(this.getSize().width, this.getSize().height); Graphics gbuff = buffered_image.getGraphics(); gbuff.setColor(java.awt.Color.magenta); setFont(gbuff); gbuff.setFont(f); gbuff.drawString(nrstring,2*fw,fh+3); gbuff.drawString(tripstring,5*fw,fh+3); gbuff.drawString(fitstring,-5*fw+fw*(pop.getIndiv(0).toPopString(true)).length(),fh+3); gbuff.setColor(java.awt.Color.black); for(i=0;i