📄 graphvisualizer.java
字号:
x2=n2.x+paddedNodeWidth/2; y2=n2.y+nodeHeight;
g.drawLine(x+x1, y+y1, x+x2, y+y2);
if(n.edges[k][1]==-DOUBLE) {
drawArrow(g, x+x2, y+y2, x+x1, y+y1);
if(n2.nodeType!=SINGULAR_DUMMY) //!n2.dummy)
drawArrow(g, x+x1, y+y1, x+x2, y+y2);
}
int tmpIndex=k;
while(n2.nodeType!=NORMAL) { //n2.dummy==true) {
g.drawLine(x+n2.x+paddedNodeWidth/2, y+n2.y+nodeHeight, x+n2.x+paddedNodeWidth/2, y+n2.y);
x1=n2.x+paddedNodeWidth/2; y1=n2.y;
for(int m=0; m<n2.edges.length; m++) {
if(n2.edges[m][1]<0) {
n2 = (GraphNode) m_nodes.elementAt(n2.edges[m][0]); //m_nodes.elementAt(m);
g.drawLine(x+x1, y+y1, x+n2.x+paddedNodeWidth/2, y+n2.y+nodeHeight);
tmpIndex=m;
if(n2.nodeType!=SINGULAR_DUMMY) //!n2.dummy)
drawArrow(g, x+x1, y+y1, x+n2.x+paddedNodeWidth/2, y+n2.y+nodeHeight);
break;
}
}
}
}
}
}
}
}
/**
* Table Model for the Table that shows the probability
* distribution for a node
*/
private class GraphVisualizerTableModel extends AbstractTableModel {
final String[] columnNames;
final double[][] data;
public GraphVisualizerTableModel(double[][] d, String[] c) {
data = d;
columnNames = c;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return new Double(data[row][col]);
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Implemented this to make sure the table is uneditable.
*/
public boolean isCellEditable(int row, int col) {
return false;
}
}
/**
* Listener class for processing mouseClicked
*/
private class GraphVisualizerMouseListener extends MouseAdapter {
int x, y, nx, ny; Rectangle r;
/**
* If the mouse is clicked on a node then this method
* displays a dialog box with the probability distribution
* table for that node IF it exists
*/
public void mouseClicked(MouseEvent me) {
GraphNode n;
Dimension d = m_gp.getPreferredSize();
//System.out.println("Preferred Size: "+this.getPreferredSize()+" Actual Size: "+this.getSize());
x=y=nx=ny=0;
if(d.width < m_gp.getWidth())
nx = (int)((nx + m_gp.getWidth()/2 - d.width/2)/scale);
if(d.height < m_gp.getHeight())
ny = (int)((ny + m_gp.getHeight()/2 - d.height/2)/scale);
r=new Rectangle(0, 0, (int)(paddedNodeWidth*scale), (int)(nodeHeight*scale));
x += me.getX(); y += me.getY();
int i;
for(i=0; i<m_nodes.size(); i++) {
n = (GraphNode) m_nodes.elementAt(i);
r.x = (int)((nx+n.x)*scale); r.y = (int)((ny+n.y)*scale);
if(r.contains(x,y)) {
if(n.probs==null)
return;
int noOfPrntsOutcomes = 1;
if(n.prnts!=null) {
for(int j=0; j<n.prnts.length; j++) {
GraphNode n2 = (GraphNode)m_nodes.elementAt(n.prnts[j]);
noOfPrntsOutcomes *= n2.outcomes.length;
}
if(noOfPrntsOutcomes>1023) {
System.err.println("Too many outcomes of parents can't display probabilities");
return;
}
}
GraphVisualizerTableModel tm = new GraphVisualizerTableModel(n.probs, n.outcomes);
JTable jTblProbs = new JTable(tm); //JTable(probabilities, (Object[])n.outcomes);
JScrollPane js = new JScrollPane(jTblProbs);
if(n.prnts!=null) {
GridBagConstraints gbc = new GridBagConstraints();
JPanel jPlRowHeader = new JPanel( new GridBagLayout() );
int [] idx = new int[n.prnts.length]; //indices of the parent nodes in the Vector
int [] lengths = new int[n.prnts.length]; //max length of values of each parent
//System.out.println("n.probs.length "+n.probs.length+" should be "+noOfPrntsOutcomes);
//System.out.println("n.probs[0].length "+n.probs[0].length+" should be "+n.outcomes.length);
//System.out.println("probabilities are: ");
//for(int j=0; j<probabilities.length; j++) {
// for(int k=0; k<probabilities[j].length; k++)
// System.out.print(probabilities[j][k]+" ");
// System.out.println("");
//}
//Adding labels for rows
gbc.anchor = gbc.NORTHWEST;
gbc.fill = gbc.HORIZONTAL;
gbc.insets = new Insets(0,1,0,0);
int addNum=0, temp=0;
boolean dark=false;
while(true){
GraphNode n2;
gbc.gridwidth = 1;
for(int k=0; k<n.prnts.length; k++) {
n2 = (GraphNode)m_nodes.elementAt(n.prnts[k]);
JLabel lb = new JLabel(n2.outcomes[idx[k]]);
lb.setFont( new Font("Dialog", Font.PLAIN, 12) );
lb.setOpaque( true );
lb.setBorder( BorderFactory.createEmptyBorder( 1,2,1,1 ) );
lb.setHorizontalAlignment( JLabel.CENTER );
if(dark) {
lb.setBackground( lb.getBackground().darker() );
lb.setForeground( Color.white );
}
else
lb.setForeground( Color.black );
temp = lb.getPreferredSize().width;
//System.out.println("Preferred width "+temp+" for "+n2.outcomes[idx[k]]);
lb.setPreferredSize( new Dimension(temp, jTblProbs.getRowHeight()) );
if(lengths[k]<temp)
lengths[k] = temp;
temp=0;
if(k==n.prnts.length-1) {
gbc.gridwidth = gbc.REMAINDER;
dark = (dark==true) ? false:true;
}
jPlRowHeader.add(lb, gbc);
addNum++;
}
for(int k=n.prnts.length-1; k>=0; k--) {
n2 = (GraphNode) m_nodes.elementAt(n.prnts[k]);
if(idx[k]==n2.outcomes.length-1 && k!=0) {
idx[k]=0;
continue;
}
else {
idx[k]++;
break;
}
}
n2 = (GraphNode) m_nodes.elementAt(n.prnts[0]);
if(idx[0]==n2.outcomes.length) {
JLabel lb= (JLabel) jPlRowHeader.getComponent(addNum-1);
jPlRowHeader.remove(addNum-1);
lb.setPreferredSize( new Dimension(lb.getPreferredSize().width, jTblProbs.getRowHeight()) );
gbc.gridwidth = gbc.REMAINDER;
gbc.weighty = 1;
jPlRowHeader.add(lb, gbc);
gbc.weighty=0;
break;
}
}
gbc.gridwidth = 1;
//The following panel contains the names of the parents
//and is displayed above the row names to identify
//which value belongs to which parent
JPanel jPlRowNames = new JPanel(new GridBagLayout());
for(int j=0; j<n.prnts.length; j++) {
JLabel lb2, lb1 = new JLabel( ((GraphNode)m_nodes.elementAt(n.prnts[j])).lbl );
lb1.setBorder( BorderFactory.createEmptyBorder( 1,2,1,1 ) );
Dimension tempd = lb1.getPreferredSize();
//System.out.println("lengths[j]: "+lengths[j]+" tempd.width: "+tempd.width);
if(tempd.width<lengths[j]) {
lb1.setPreferredSize( new Dimension(lengths[j], tempd.height) );
lb1.setHorizontalAlignment( JLabel.CENTER );
lb1.setMinimumSize( new Dimension(lengths[j], tempd.height) );
}
else if(tempd.width>lengths[j]) {
lb2 = (JLabel) jPlRowHeader.getComponent(j);
lb2.setPreferredSize( new Dimension(tempd.width, lb2.getPreferredSize().height) );
}
jPlRowNames.add(lb1, gbc);
//System.out.println("After adding "+lb1.getPreferredSize());
}
js.setRowHeaderView(jPlRowHeader);
js.setCorner( JScrollPane.UPPER_LEFT_CORNER, jPlRowNames );
}
JDialog jd = new JDialog((Frame)GraphVisualizer.this.getTopLevelAncestor(),
"Probability Distribution Table For "+n.lbl, true);
jd.setSize(500, 400);
jd.setLocation( GraphVisualizer.this.getLocation().x+GraphVisualizer.this.getWidth()/2-250,
GraphVisualizer.this.getLocation().y+GraphVisualizer.this.getHeight()/2-200 );
jd.getContentPane().setLayout( new BorderLayout() );
jd.getContentPane().add(js, BorderLayout.CENTER);
jd.setVisible(true);
return;
}
}
}
}
/**
* private class for handling mouseMoved events
* to highlight nodes if the the mouse is moved on
* one
*/
private class GraphVisualizerMouseMotionListener extends MouseMotionAdapter {
int x, y, nx, ny; Rectangle r;
GraphNode lastNode;
public void mouseMoved(MouseEvent me) {
GraphNode n;
Dimension d = m_gp.getPreferredSize();
//System.out.println("Preferred Size: "+this.getPreferredSize()+" Actual Size: "+this.getSize());
x=y=nx=ny=0;
if(d.width < m_gp.getWidth())
nx = (int)((nx + m_gp.getWidth()/2 - d.width/2)/scale);
if(d.height < m_gp.getHeight())
ny = (int)((ny + m_gp.getHeight()/2 - d.height/2)/scale);
r=new Rectangle(0, 0, (int)(paddedNodeWidth*scale), (int)(nodeHeight*scale));
x += me.getX(); y += me.getY();
int i;
for(i=0; i<m_nodes.size(); i++) {
n = (GraphNode) m_nodes.elementAt(i);
r.x = (int)((nx+n.x)*scale); r.y = (int)((ny+n.y)*scale);
if(r.contains(x,y)) {
if(n!=lastNode) {
m_gp.highLight(n);
if(lastNode!=null)
m_gp.highLight(lastNode);
lastNode = n; //lastIndex = i;
}
break;
}
}
if(i==m_nodes.size() && lastNode!=null) {
m_gp.repaint();
//m_gp.highLight(lastNode);
lastNode=null;
}
}
}
/**
* Main method to load a text file with the
* description of a graph from the command
* line
*/
public static void main(String [] args) {
JFrame jf = new JFrame("Graph Visualizer");
GraphVisualizer g = new GraphVisualizer();
try{
if(args[0].endsWith(".xml")) {
//StringBuffer sb = new StringBuffer();
//FileReader infile = new FileReader(args[0]);
//int i;
//while( (i=infile.read())!=-1) {
// sb.append((char)i);
//}
//System.out.println(sb.toString());
//g.readBIF(sb.toString() );
g.readBIF( new FileInputStream(args[0]) );
}
else {
//BufferedReader infile=new BufferedReader();
g.readDOT(new FileReader(args[0])); //infile);
}
}
catch(IOException ex) { ex.printStackTrace(); }
catch(BIFFormatException bf) { bf.printStackTrace(); System.exit(-1); }
jf.getContentPane().add(g);
//RepaintManager.currentManager(jf.getRootPane()).setDoubleBufferingEnabled(false);
jf.setDefaultCloseOperation( jf.EXIT_ON_CLOSE );
jf.setSize(800,600);
//jf.pack();
jf.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -