⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpanel.java

📁 一个小型网络仿真器的实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
   JaNetSim  ---  Java Network Simulator
   -------------------------------------

   This software was developed at the Network Research Lab, Faculty of
   Computer Science and Information Technology (FCSIT), University of Malaya.
   This software may be used and distributed freely. FCSIT assumes no responsibility
   whatsoever for its use by other parties, and makes no guarantees, expressed or
   implied, about its quality, reliability, or any other characteristic.

   We would appreciate acknowledgement if the software is used.

   FCSIT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
   DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
   FROM THE USE OF THIS SOFTWARE.
*/

package janetsim;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.MemoryImageSource;

class SimPanel extends JPanel implements MouseListener,MouseMotionListener {
  private Sim theSim=null;
  private SimGUI theGUI=null;

//mode constants
  static final int NORMAL = 0;
  static final int CONNECT = 1;

//for selections
  private Image shadowImg=null;
  private Point origin=null;
  private Rectangle window=null;
  private boolean moving=false;
  private boolean anchored=false;
  private boolean toggling=false;
  private java.util.List toggledOn=null;
  private java.util.List toggledOff=null;

//for connections
  private boolean connecting=false;
  private Point currentHot=null;
  private SimComponent lastHover=null;
  private SimComponent lastSelected=null;

//zooming
  private boolean isZooming=false;
  private double zoomFactor=1.0;

//animation
  private AnimRunner anim=null;

  private class AnimRunner implements Runnable {
    private java.util.List comps=null;
    private java.util.List ids=null;
    private Thread animthread=null;
    private int delay;

    AnimRunner() {
      comps=new java.util.ArrayList();
      ids=new java.util.ArrayList();

      delay=Sim.OPTIMUM_DELAY;
    }
    synchronized void addMember(SimComponent acomp,int compinfo_id) {
      comps.add(acomp);
      ids.add(new Integer(compinfo_id));

      if(comps.size()==1) {
        startAnim();
      }
    }
    synchronized void removeMember(SimComponent acomp,int compinfo_id) {
      for(int i=0;i<comps.size();i++) {
        if((SimComponent)comps.get(i) == acomp &&
          ((Integer)ids.get(i)).intValue() == compinfo_id) {
          comps.remove(i);
          ids.remove(i);
          break;
        }
      }
      if(comps.isEmpty()) {
        stopAnim();
      }
    }
    synchronized void startAnim() {
      if(!comps.isEmpty() && animthread==null) {
        animthread=new Thread(this);
        animthread.start();
      }
    }
    synchronized void stopAnim() {
      animthread=null;
    }
    synchronized void doAnim(Graphics g) {
      for(int i=0;i<comps.size();i++) {
        SimComponent acomp=(SimComponent)comps.get(i);
        Object [] paramlist=new Object [3];
        paramlist[0]=g;
        paramlist[1]=new Boolean(isZooming);
        paramlist[2]=new Double(zoomFactor);
        acomp.compInfo(((Integer)ids.get(i)).intValue(),null,paramlist);
      }
    }
    public void run() {
      Thread thisThread=Thread.currentThread();
      long t,sleeptime;

      t=System.currentTimeMillis();
      while(animthread == thisThread) {
        repaint();
        t+=delay;
        sleeptime=t-System.currentTimeMillis();
        if(sleeptime<0) {
          sleeptime=0;
          delay++;
          if(delay>=Sim.MAX_DELAY) {
            System.out.println("Warning: animation framerate too low now...");
          }
        }
        else if(delay>Sim.OPTIMUM_DELAY) {
          delay--;
        }
        try { Thread.sleep(sleeptime); }
        catch (InterruptedException e) { break; }
      }
    }
  }

  SimPanel(Sim aSim,SimGUI aGUI) {
    super();

    theSim=aSim;
    theGUI=aGUI;

    anim=new AnimRunner();

    //create shadow image (for selection highlight)
    int [] shadow = new int[4];
    for(int i=0;i<4;i++) shadow[i]=0x30ff0000;
    shadowImg=createImage(new MemoryImageSource(2,2,shadow,0,2));

    //listen for user inputs
    addMouseListener(this);
    addMouseMotionListener(this);
  }

  public void mousePressed(MouseEvent e) {
    if(isZooming)
      e.translatePoint((int)(e.getX()/zoomFactor-e.getX()),
                        (int)(e.getY()/zoomFactor-e.getY()));

    if(connecting) {
      if(SwingUtilities.isLeftMouseButton(e)) {
        currentHot=e.getPoint();
        if(lastHover!=null) {
          lastHover.setSelected(false);
          lastHover=null;
        }
        SimComponent comp=isHit(e.getPoint());
        if(comp!=null) {
          if(lastSelected!=null) {
            if(lastSelected!=comp) {
              //We want to add neighbor now!!!
              if(connectComponents(lastSelected,comp)) {
                lastSelected.setSelected(false);
                lastSelected=null;
              }
            }
          }
          else {
            lastSelected=comp;
            comp.setSelected(true);
          }
        }
        else if(lastSelected!=null) {
          lastSelected.setSelected(false);
          lastSelected=null;
        }
      }
    }
    else {
      if(SwingUtilities.isLeftMouseButton(e)) {
        origin=new Point(e.getX(),e.getY());
        SimComponent comp=isHit(origin);
        if(comp!=null) {
          if(e.isControlDown()) {
            if(comp.isSelected()) comp.setSelected(false);
            else comp.setSelected(true);
          }
          else {
            if(!comp.isSelected()) {
              deselectAll();
              comp.setSelected(true);
            }
            moving=true;
          }
        }
        else {
          if(e.isControlDown()) {
            window=new Rectangle(e.getPoint());
            toggledOn=new java.util.ArrayList();
            toggledOff=new java.util.ArrayList();
            toggling=true;
          }
          else {
            deselectAll();
            window=new Rectangle(e.getPoint());
            anchored=true;
          }
        }
      }
      else {
        clearAllState();
        SimComponent comp=isHit(e.getPoint());
        if(comp!=null) {
          if(!comp.isSelected()) {
            deselectAll();
            comp.setSelected(true);
          }
        }
        else {
          deselectAll();
        }
      }
    }
    repaint();
  }

  public void mouseDragged(MouseEvent e) {
    if(isZooming)
      e.translatePoint((int)(e.getX()/zoomFactor-e.getX()),
                        (int)(e.getY()/zoomFactor-e.getY()));

    if(connecting) {
      if(SwingUtilities.isLeftMouseButton(e)) {
        if(lastSelected!=null) {
          currentHot=e.getPoint();
          if(lastHover!=null) {
            lastHover.setSelected(false);
            lastHover=null;
          }
          SimComponent comp=isHit(e.getPoint());
          if (comp!=null && comp!=lastSelected) {
            comp.setSelected(true);
            lastHover=comp;
          }
        }
      }
    }
    else {
      if(SwingUtilities.isLeftMouseButton(e)) {
        if(moving) {
          moveSelectedComponents(e.getX()-origin.x,e.getY()-origin.y);
          origin.setLocation(e.getX(),e.getY());
        }
        else if(anchored) {
          window=new Rectangle(Math.min(origin.x,e.getX()),Math.min(origin.y,e.getY()),
                                Math.abs(e.getX()-origin.x),Math.abs(e.getY()-origin.y));
          windowSelect(window);
        }
        else if(toggling) {
          window=new Rectangle(Math.min(origin.x,e.getX()),Math.min(origin.y,e.getY()),
                                Math.abs(e.getX()-origin.x),Math.abs(e.getY()-origin.y));
          windowToggle(window);
        }
      }
      else {
      }
    }
    repaint();
  }

  public void mouseReleased(MouseEvent e) {
    if(isZooming)
      e.translatePoint((int)(e.getX()/zoomFactor-e.getX()),
                        (int)(e.getY()/zoomFactor-e.getY()));

    if(connecting) {
      if(SwingUtilities.isLeftMouseButton(e)) {
        if(lastSelected!=null) {
          currentHot=e.getPoint();
          if(lastHover!=null) {
            lastHover.setSelected(false);
            lastHover=null;
          }
          SimComponent comp=isHit(e.getPoint());
          if (comp!=null) {
            if(comp != lastSelected) {
              //We want to add neighbor now!!!
              if(connectComponents(lastSelected,comp)) {
                lastSelected.setSelected(false);
                lastSelected=null;
                comp.setSelected(true);
                lastHover=comp;
              }
            }
          }
          else {
            lastSelected.setSelected(false);
            lastSelected=null;
          }
        }
      }
      else {
        theGUI.endConnectMode();
      }
    }
    else {
      if(SwingUtilities.isLeftMouseButton(e)) {
        if(moving) {
          moveSelectedComponents(e.getX()-origin.x,e.getY()-origin.y);
          moving=false;
          theGUI.GUIChanged();
        }
        else if(anchored) {
          window=new Rectangle(Math.min(origin.x,e.getX()),Math.min(origin.y,e.getY()),
                                Math.abs(e.getX()-origin.x),Math.abs(e.getY()-origin.y));
          windowSelect(window);
          anchored=false;
        }
        else if(toggling) {
          window=new Rectangle(Math.min(origin.x,e.getX()),Math.min(origin.y,e.getY()),
                                Math.abs(e.getX()-origin.x),Math.abs(e.getY()-origin.y));
          windowToggle(window);
          toggledOn=null;
          toggledOff=null;
          toggling=false;
        }
      }
      else {
        clearAllState();
        theGUI.showPopupMenu(e);
      }
    }
    repaint();
  }

  public void mouseMoved(MouseEvent e) {
    if(isZooming)
      e.translatePoint((int)(e.getX()/zoomFactor-e.getX()),
                        (int)(e.getY()/zoomFactor-e.getY()));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -