开发者

Convert java applet to java application

i try to implement this java applet source code into java application with using JFrame but it doesn't work. and i changed little bit to read file from my computer but it also doesn't work.

how can i convert this into application?

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.URL;

class Node {
 int x;
 int y;
 int delta_plus; /* edge starts from this node */
 int delta_minus; /* edge terminates at this node */
 int dist;  /* distance from the start node */
 int prev;  /* previous node of the shortest path */
 int succ,pred; /* node in Sbar with finite dist. */
 int w;
 int h;
 int pw;
 int dx;
 int dy;
 String name;
}

class Edge {
 int rndd_plus; /* initial vertex of this edge */
 int rndd_minus; /* terminal vertex of this edge */
 int delta_plus; /* edge starts from rndd_plus */
 int delta_minus; /* edge terminates at rndd_minus */
 int len;  /* length */
     String name;
}

public class Prim extends Applet implements MouseListener {
 int n,m;
 int u,snode; /* start node */
 int pre_s_first, pre_s_last;
 boolean isdigraph;
 int iteration, step;
 Node v[] = new Node[100];
 Edge e[] = new Edge[200];

 int findNode(String name) {
  for (int i=0; i<n; i++)
   if (v[i].name.equals(name))
    return i;
  return -1;
 }

 void input_graph(InputStream is) throws IOException {
  int x,y,l;
  String s;

  Reader r = new BufferedReader(new InputStreamReader(is));
  StreamTokenizer st = new StreamTokenizer(r);
  st.commentChar('#');
  st.nextToken(); n = (int)st.nval;
  st.nextToken(); m = (int)st.nval;
  st.nextToken(); s = st.sval;
  isdigraph = "digraph".equals(s);
  for (int i = 0; i<n; i++) {
   Node node = new Node();
   st.nextToken(); node.name = st.sval;
   st.nextToken(); node.x = (int)st.nval;
   st.nextToken(); node.y = (int)st.nval;
   v[i] = node;
  }
  for (int i = 0; i<m; i++) {
   Edge edge = new Edge();
   st.nextToken(); edge.name = st.sval;
   switch (st.nextToken()) {
   case StreamTokenizer.TT_NUMBER:
    edge.rndd_plus = (int)st.nval;
    break;
   case StreamTokenizer.TT_WORD:
    edge.rndd_plus = findNode(st.sval);
    break;
   default:
    break;
   }
   switch (st.nextToken()) {
   case StreamTokenizer.TT_NUMBER:
    edge.rndd_minus = (int)st.nval;
    break;
   case StreamTokenizer.TT_WORD:
    edge.rndd_minus = findNode(st.sval);
    break;
   default:
    break;
   }
   st.nextToken(); edge.len = (int)st.nval;
   e[i] = edge;
  }
  for (int i=0; i<n; i++) {
   v[i].succ = v[i].pred = -2;
   v[i].prev = v[i].dist = -1;
   v[i].pw = 0;
  }
  iteration = step = 0;
 }

 void rdb() {
  int i,k;

  for (i=0; i<n; i++)
   v[i].delta_plus = v[i].delta_minus = -1;
  for (i=0; i<m; i++)
   e[i].delta_plus = e[i].delta_minus = -1;
  for (i=0; i<m; i++) {
   k = e[i].rndd_plus;
   if (v[k].delta_plus == -1)
    v[k].delta_plus = i;
   else {
    k = v[k].delta_plus;
    while(e[k].delta_plus >= 0)
     k = 开发者_运维知识库e[k].delta_plus;
    e[k].delta_plus = i;
   }
   k = e[i].rndd_minus;
   if (v[k].delta_minus == -1)
    v[k].delta_minus = i;
   else {
    k = v[k].delta_minus;
    while(e[k].delta_minus >= 0)
     k = e[k].delta_minus;
    e[k].delta_minus = i;
   }
  }
 }

 void append_pre_s(int i) {
  v[i].succ = v[i].pred = -1;
  if (pre_s_first<0)
   pre_s_first = i;
  else
   v[pre_s_last].succ = i;
  v[i].pred = pre_s_last;
  pre_s_last = i;
 }

 void remove_pre_s(int i) {
  int succ = v[i].succ;
  int pred = v[i].pred;

  if (succ>=0)
   v[succ].pred = pred;
  else
   pre_s_last = pred;
  if (pred>=0)
   v[pred].succ = succ;
  else
   pre_s_first = succ;
 }

 void step1() {  /* initialize */
  u = snode;
  for (int i=0; i<n; i++) {
   v[i].succ = v[i].pred = -2;
   v[i].prev = v[i].dist = -1;
  }
  v[u].succ = -3;
  v[u].dist = 0;
  pre_s_first = pre_s_last = -1;
 }

 void step2() {  /* replace labels */
  int i,j;

  j = v[u].delta_plus;
  while (j>=0) {
   i = e[j].rndd_minus;
   if ((v[i].succ>=-2)&&((v[i].dist<0)||
    (v[i].dist>e[j].len))) {
    if (v[i].dist<0)
     append_pre_s(i);
    v[i].dist = e[j].len;
    v[i].prev = u;   /* label */
   }
   j = e[j].delta_plus;
  }
  if (!isdigraph) {
  j = v[u].delta_minus;
  while (j>=0) {
   i = e[j].rndd_plus;
   if ((v[i].succ>=-2)&&((v[i].dist<0)||
    (v[i].dist>e[j].len))) {
    if (v[i].dist<0)
     append_pre_s(i);
    v[i].dist = e[j].len;
    v[i].prev = u;   /* label */
   }
   j = e[j].delta_minus;
  }
  }
  v[u].succ = -4;
 }

 void step3() {  /* find the shortest node in Sbar */
  int i,rho;

  rho = -1;
  for (i = pre_s_first; i>=0; i = v[i].succ) {
   if ((rho < 0)||(rho>v[i].dist)) {
    rho = v[i].dist;
    u = i;
   }
  }
  remove_pre_s(u);
  v[u].succ = -3;
 }

 void step4() {
  v[u].succ = -4;
 }

 double weight(Node n, double x, double y) {
  double w,z,xx,yy;

  w = 0;
  for (int j = n.delta_plus; j>=0; j=e[j].delta_plus) {
   xx = (double)(v[e[j].rndd_minus].x - n.x);
   yy = (double)(v[e[j].rndd_minus].y - n.y);
   z = (x*xx+y*yy)/Math.sqrt((x*x+y*y)*(xx*xx+yy*yy))+1.0;
   w += z*z*z*z;
  }
  for (int j = n.delta_minus; j>=0; j=e[j].delta_minus) {
   xx = (double)(v[e[j].rndd_plus].x - n.x);
   yy = (double)(v[e[j].rndd_plus].y - n.y);
   z = (x*xx+y*yy)/Math.sqrt((x*x+y*y)*(xx*xx+yy*yy))+1.0;
   w += z*z*z*z;
  }
  return w;
 }

 void init_sub() {
  int x[] = {1, 0, -1, 1, 0, -1};
  int y[] = {1, 1, 1, -1, -1, -1};
  int  i,j,k;
  double w,z;

  for (i=0; i<n; i++) {
   k=0;
   w=weight(v[i],(double)x[0],(double)y[0]);
   for (j=1; j<6; j++) {
    z=weight(v[i],(double)x[j],(double)y[j]);
    if (z<w) {
     w = z;
     k = j;
    }
   }
   v[i].dx = x[k];
   v[i].dy = y[k];
  }
 }

 public void init() {
  try {
   InputStream is;

   is = new URL("input address").openStream();
   input_graph(is);
   try {
    if (is != null)
     is.close();
    } catch(Exception e) {
   }
  } catch (FileNotFoundException e) {
   System.err.println("File not found.");
  } catch (IOException e) {
   System.err.println("Cannot access file.");
  }

  String s = getParameter("start");
  if (s != null)
   snode = Integer.parseInt(s);
  else
   snode = 0;

  setBackground(Color.white);
  rdb();
  init_sub();
  addMouseListener(this);
 }

 public void paintNode(Graphics g, Node n, FontMetrics fm) {
  String s;
  int x = n.x;
  int y = n.y;
  int w = fm.stringWidth(n.name) + 10;
  int h = fm.getHeight() + 4;
  n.w = w;
  n.h = h;

  if (n.succ<-2)
   g.setColor(Color.blue);
  else if (n.succ==-2)
   g.setColor(Color.gray);
  else
   g.setColor(Color.red);

  g.drawRect(x-w/2,y-h/2,w,h);

  if (n.succ==-4)
   g.setColor(Color.cyan);
  else if (n.succ==-3)
   g.setColor(Color.pink);
  else if (n.succ>-2)
   g.setColor(Color.yellow);
  else
   g.setColor(getBackground());

  g.fillRect(x-w/2+1,y-h/2+1,w-1,h-1);

  g.setColor(Color.black);
  g.drawString(n.name,x-(w-10)/2,(y-(h-4)/2)+fm.getAscent());


  if (n.dist<0)
   s = "";
  else
   s = ""+n.dist;
  w = fm.stringWidth(s) + 10;
  x += (h+1)*n.dx; y += (h+1)*n.dy;
  g.setColor(getBackground());
  g.fillRect(x-n.pw/2,y-h/2,n.pw,h);
  n.pw = w;
  if (n.succ<-2)
   g.setColor(Color.blue);
  else
   g.setColor(Color.red);
  g.drawString(s,x-(w-10)/2,y-(h-4)/2+fm.getAscent());
 }

 int [] xy(int a, int b, int w, int h) {
  int x[] = new int[2];

  if (Math.abs(w*b)>=Math.abs(h*a)) {
   x[0] = ((b>=0)?1:-1)*a*h/b/2;
   x[1] = ((b>=0)?1:-1)*h/2;
  } else {
   x[0] = ((a>=0)?1:-1)*w/2;
   x[1] = ((a>=0)?1:-1)*b*w/a/2;
  }
  return x;
 }

 void drawArrow(Graphics g,int x1,int y1,int x2,int y2) {
  int a = x1-x2;
  int b = y1-y2;

  if (isdigraph) {
  double aa = Math.sqrt(a*a+b*b)/16.0;
  double bb = b/aa;
   aa = a/aa;
  g.drawLine(x2,y2,x2+(int)((aa*12+bb*5)/13),y2+(int)((-aa*5+bb*12)/13));
  g.drawLine(x2,y2,x2+(int)((aa*12-bb*5)/13),y2+(int)((aa*5+bb*12)/13));
  }
  g.drawLine(x1,y1,x2,y2);
 }

 public void paintEdge(Graphics g, Edge e, FontMetrics fm) {
  Node v1 = v[e.rndd_plus];
  Node v2 = v[e.rndd_minus];

  int a = v1.x-v2.x;
  int b = v1.y-v2.y;

  int x1[] = xy(-a,-b,v1.w,v1.h);
  int x2[] = xy(a,b,v2.w,v2.h);

  if (v2.prev == e.rndd_plus) {
   if ((v1.succ<-2)&&(v2.succ>=-2))
      g.setColor(Color.red);
   else
    g.setColor(Color.blue);
  } else {
   g.setColor(Color.lightGray);
  }
  if ((!isdigraph)&&(v1.prev == e.rndd_minus)) {
      if ((v2.succ<-2)&&(v1.succ>=-2))
        g.setColor(Color.red);
  else
    g.setColor(Color.blue);
  }
  drawArrow(g,v1.x+x1[0],v1.y+x1[1],v2.x+x2[0],v2.y+x2[1]);

  int w = fm.stringWidth("" + e.len);
  int h = fm.getHeight();

  g.setColor(getBackground());
  g.fillRect((v1.x+v2.x-w)/2,(v1.y+v2.y-h)/2,w,h);

  if ((v2.prev == e.rndd_plus)||
      ((!isdigraph)&&(v1.prev == e.rndd_minus)))
   g.setColor(Color.black);
  else
   g.setColor(Color.lightGray);
  g.drawString("" + e.len,(v1.x+v2.x-w)/2,(v1.y+v2.y-h)/2+fm.getAscent());
 }

 public void paint(Graphics g) {
  FontMetrics fm = g.getFontMetrics();
  for (int i=0; i<n; i++)
   paintNode(g,v[i],fm);
      for (int i=0; i<m; i++)
       paintEdge(g,e[i],fm);
 }

 public void update(Graphics g) {
  paint(g);
 }

 public void mousePressed(MouseEvent ev) {
  if (iteration==0) {
   step1();
   iteration++;
   step = 2;
  } else if (iteration>=n) {
   step4();
//   iteration = 0;
  } else {
   if (step == 2) {
    step2();
    step = 3;
   } else {
    step3();
    iteration++;
    step = 2;
   }
  }
 repaint();
 }
 public void mouseClicked(MouseEvent event) {}
 public void mouseReleased(MouseEvent event) {}
 public void mouseEntered(MouseEvent event) {}
 public void mouseExited(MouseEvent event) {}
}


Here are some links for you to read:

  • Turning an Applet into a Standalone Application
  • Converting an Applet to an Application

And there are lots of others. (Google is your friend.)

If this doesn't help, feel free to ask a specific question.


You can try adding this:

 public static void main(String[] args) {
     Prim prim = new Prim() {
         @Override
         public String getParameter(String key) {
             if ("start".equals(key)) {
                 return "0";
             }
             else {
                 return "";
             }
         }
     };
     prim.init();
 }

BTW, you should put in a real value for URL("input address").

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜