📄 simpanel.java
字号:
/*
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 + -