simparamip.java
来自「一个小型网络仿真器的实现」· Java 代码 · 共 277 行
JAVA
277 行
/*
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.component;
import janetsim.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.math.*;
//Very flexible IP and/or mask parameter,
//Can be used for IP only or IP+mask
public class SimParamIP extends SimParameter implements ActionListener,java.io.Serializable {
private int valueip,valuemask;
private transient JComponent jcomp=null;
private boolean isEditable;
private boolean ipOnly;
public SimParamIP(String aName,SimComponent comp,long creationTick,boolean isLoggable,
boolean editable,int valip) {
this(aName,comp,creationTick,isLoggable,editable,true,valip,0xffffffff);
}
public SimParamIP(String aName,SimComponent comp,long creationTick,boolean isLoggable,
boolean editable,int valip,int valmask) {
this(aName,comp,creationTick,isLoggable,editable,false,valip,valmask);
}
public SimParamIP(String aName,SimComponent comp,long creationTick,boolean isLoggable,
boolean editable,boolean isIPOnly,int valip,int valmask) {
super(aName,comp,creationTick,isLoggable);
isEditable=editable;
ipOnly=isIPOnly;
valueip=valip;
valuemask=valmask;
}
////////////// possible overrides //////////////////////////
public int getValue() {
return valueip;
}
public int getIP() {
return valueip;
}
public int getMask() {
return valuemask;
}
public void setValue(int val) {
setValue(val,valuemask);
}
public void setValue(int valip,int valmask) {
valueip=valip;
valuemask=valmask;
if(jcomp!=null) scheduleUpdate();
}
//helper for thread safe GUI update
private void scheduleUpdate() {
Runnable r=new Runnable() {
public void run() {
if(isEditable) ((JButton)jcomp).setText(getString());
else ((JLabel)jcomp).setText(getString());
}
};
SwingUtilities.invokeLater(r);
}
public boolean globalSetValue(String val) { //right now supports IP only (no mask)
String ip=val+".";
int thisIndex,lastIndex=0;
int quad;
int newIP=0;
for(int i=0;i<4;i++) {
thisIndex=ip.indexOf('.',lastIndex);
if(thisIndex==-1) return false;
try {
quad=Integer.parseInt(ip.substring(lastIndex,thisIndex));
if(quad<0 || quad>255) return false;
} catch(NumberFormatException ex) {
return false;
}
newIP<<=8;
newIP|=quad;
lastIndex=thisIndex+1;
}
setValue(newIP);
return true;
}
public String getStringIP() {
String ip=String.valueOf((valueip>>24)&0xff)+".";
ip+=String.valueOf((valueip>>16)&0xff)+".";
ip+=String.valueOf((valueip>>8)&0xff)+".";
ip+=String.valueOf(valueip&0xff);
return ip;
}
public String getStringMask() {
String mask=String.valueOf((valuemask>>24)&0xff)+".";
mask+=String.valueOf((valuemask>>16)&0xff)+".";
mask+=String.valueOf((valuemask>>8)&0xff)+".";
mask+=String.valueOf(valuemask&0xff);
return mask;
}
public String getString() {
return getStringIP();
}
public JComponent getJComponent() {
if(jcomp==null) {
if(isEditable) {
jcomp=new JButton(getString());
((JButton)jcomp).setHorizontalAlignment(JButton.LEFT);
((JButton)jcomp).addActionListener(this);
}
else {
jcomp=new JLabel(getString());
((JLabel)jcomp).setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.black),
BorderFactory.createEmptyBorder(0,5,0,5)));
}
}
return jcomp;
}
private class IPDialogListener implements ActionListener,FocusListener {
JDialog dialog=null;
JTextField txtIP=null;
JTextField txtMask=null;
JButton btnOK=null;
JButton btnCancel=null;
int newIP,newMask;
private boolean ipOK() {
String ip=txtIP.getText()+".";
int thisIndex,lastIndex=0;
int quad;
newIP=0;
for(int i=0;i<4;i++) {
thisIndex=ip.indexOf('.',lastIndex);
if(thisIndex==-1) return false;
try {
quad=Integer.parseInt(ip.substring(lastIndex,thisIndex));
if(quad<0 || quad>255) return false;
} catch(NumberFormatException ex) {
return false;
}
newIP<<=8;
newIP|=quad;
lastIndex=thisIndex+1;
}
return true;
}
private boolean maskOK() {
String mask=txtMask.getText()+".";
int thisIndex,lastIndex=0;
int quad;
newMask=0;
for(int i=0;i<4;i++) {
thisIndex=mask.indexOf('.',lastIndex);
if(thisIndex==-1) return false;
try {
quad=Integer.parseInt(mask.substring(lastIndex,thisIndex));
if(quad<0 || quad>255) return false;
} catch(NumberFormatException ex) {
return false;
}
newMask<<=8;
newMask|=quad;
lastIndex=thisIndex+1;
}
//verify mask, is there a better way?
if(newMask==0 || newMask==0xffffffff) return true;
if(newMask>0) return false; //must have leading one!
mask=Integer.toBinaryString(newMask);
if(mask.lastIndexOf('1')!=(mask.indexOf('0')-1)) return false;
return true;
}
public void focusGained(FocusEvent e) {
if(!txtIP.getText().equals("") && txtMask.getText().equals("")) {
if(ipOK()) {
int quad=(newIP>>24)&0xff;
if(quad<128) txtMask.setText("255.0.0.0");
else if(quad<192) txtMask.setText("255.255.0.0");
else txtMask.setText("255.255.255.0");
txtMask.setCaretPosition(0);
txtMask.moveCaretPosition(txtMask.getText().length());
}
}
}
public void focusLost(FocusEvent e) {
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnOK) {
if(!ipOK()) {
JOptionPane.showMessageDialog(null,"Not a valid IP address!","Error",
JOptionPane.INFORMATION_MESSAGE);
txtIP.requestFocus();
return;
}
if(!ipOnly) {
if(!maskOK()) {
JOptionPane.showMessageDialog(null,"Not a valid net mask!","Error",
JOptionPane.INFORMATION_MESSAGE);
txtMask.requestFocus();
return;
}
setValue(newIP,newMask);
}
else
setValue(newIP);
dialog.dispose();
return;
}
else {
dialog.dispose();
return;
}
}
}
public void actionPerformed(ActionEvent e) {
IPDialogListener listener=new IPDialogListener();
listener.dialog=new JDialog(theGUI.getMainFrame(),getName(),true);
listener.dialog.getContentPane().setLayout(new GridLayout(3,1));
JPanel aPanel=new JPanel();
aPanel.add(new JLabel("IP address:"));
aPanel.add(listener.txtIP=new JTextField(10));
listener.dialog.getContentPane().add(aPanel);
aPanel=new JPanel();
aPanel.add(new JLabel("Net mask:"));
aPanel.add(listener.txtMask=new JTextField(10));
listener.dialog.getContentPane().add(aPanel);
aPanel=new JPanel();
aPanel.add(listener.btnOK=new JButton("OK"));
aPanel.add(listener.btnCancel=new JButton("Cancel"));
listener.dialog.getContentPane().add(aPanel);
listener.dialog.getRootPane().setDefaultButton(listener.btnOK);
listener.btnOK.addActionListener(listener);
listener.btnCancel.addActionListener(listener);
listener.txtIP.setText(getString());
if(getMask()!=0) listener.txtMask.setText(getStringMask());
if(ipOnly) listener.txtMask.setEnabled(false);
else listener.txtMask.addFocusListener(listener);
listener.txtIP.setCaretPosition(0);
listener.txtIP.moveCaretPosition(listener.txtIP.getText().length());
listener.dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
listener.dialog.pack();
Dimension ddim=listener.dialog.getPreferredSize();
Dimension sdim=Toolkit.getDefaultToolkit().getScreenSize();
listener.dialog.setLocation((sdim.width-ddim.width)/2,(sdim.height-ddim.height)/2);
listener.dialog.show();
}
///////////////// class service ///////////////////////////
public static String IP2String(int ipnum) {
String ip=String.valueOf((ipnum>>24)&0xff)+".";
ip+=String.valueOf((ipnum>>16)&0xff)+".";
ip+=String.valueOf((ipnum>>8)&0xff)+".";
ip+=String.valueOf(ipnum&0xff);
return ip;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?