📄 graphvisualizer.java
字号:
else
System.err.println(ICONPATH+"extra.gif not found for weka.gui.graphvisualizer.Graph");
jBtExtraControls.setToolTipText("Show/Hide extra controls");
final JCheckBox jCbCustomNodeSize = new JCheckBox("Custom Node Size");
final JLabel jLbNodeWidth = new JLabel("Width");
final JLabel jLbNodeHeight = new JLabel("Height");
jTfNodeWidth.setHorizontalAlignment(JTextField.CENTER);
jTfNodeWidth.setText(""+nodeWidth);
jTfNodeHeight.setHorizontalAlignment(JTextField.CENTER);
jTfNodeHeight.setText(""+nodeHeight);
jLbNodeWidth.setEnabled(false);
jTfNodeWidth.setEnabled(false);
jLbNodeHeight.setEnabled(false);
jTfNodeHeight.setEnabled(false);
jCbCustomNodeSize.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if( ((JCheckBox)ae.getSource()).isSelected() ) {
jLbNodeWidth.setEnabled(true);
jTfNodeWidth.setEnabled(true);
jLbNodeHeight.setEnabled(true);
jTfNodeHeight.setEnabled(true);
}
else {
jLbNodeWidth.setEnabled(false);
jTfNodeWidth.setEnabled(false);
jLbNodeHeight.setEnabled(false);
jTfNodeHeight.setEnabled(false);
setAppropriateNodeSize();
}
}
});
jBtLayout = new JButton("Layout Graph");
jBtLayout.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ae) {
int tmpW, tmpH;
if(jCbCustomNodeSize.isSelected()) {
try{ tmpW = Integer.parseInt(jTfNodeWidth.getText()); }
catch(NumberFormatException ne) {
JOptionPane.showMessageDialog(GraphVisualizer.this.getParent(),
"Invalid integer entered for node width.",
"Error",
JOptionPane.ERROR_MESSAGE);
tmpW = nodeWidth;
jTfNodeWidth.setText(""+nodeWidth);
}
try{ tmpH = Integer.parseInt(jTfNodeHeight.getText()); }
catch(NumberFormatException ne) {
JOptionPane.showMessageDialog(GraphVisualizer.this.getParent(),
"Invalid integer entered for node height.",
"Error",
JOptionPane.ERROR_MESSAGE);
tmpH = nodeHeight;
jTfNodeWidth.setText(""+nodeHeight);
}
if(tmpW!=nodeWidth || tmpH!=nodeHeight) {
nodeWidth = tmpW; paddedNodeWidth = nodeWidth+8; nodeHeight = tmpH;
}
}
JButton bt = (JButton)ae.getSource();
bt.setEnabled(false);
m_le.setNodeSize(paddedNodeWidth, nodeHeight);
m_le.layoutGraph();
}
});
GridBagConstraints gbc = new GridBagConstraints();
final JPanel p = new JPanel(new GridBagLayout());
gbc.gridwidth = gbc.REMAINDER;
gbc.anchor = gbc.NORTHWEST;
gbc.fill = gbc.NONE;
p.add( m_le.getControlPanel(), gbc);
gbc.gridwidth = 1;
gbc.insets = new Insets(8,0,0,0);
gbc.anchor = gbc.NORTHWEST;
gbc.gridwidth = gbc.REMAINDER;
p.add( jCbCustomNodeSize, gbc );
gbc.insets = new Insets(0,0,0,0);
gbc.gridwidth = gbc.REMAINDER;
Container c = new Container();
c.setLayout( new GridBagLayout() );
gbc.gridwidth = gbc.RELATIVE;
c.add(jLbNodeWidth, gbc);
gbc.gridwidth = gbc.REMAINDER;
c.add(jTfNodeWidth, gbc);
gbc.gridwidth = gbc.RELATIVE;
c.add(jLbNodeHeight, gbc);
gbc.gridwidth = gbc.REMAINDER;
c.add(jTfNodeHeight, gbc);
gbc.fill = gbc.HORIZONTAL;
p.add( c, gbc );
gbc.anchor = gbc.NORTHWEST;
gbc.insets = new Insets(8,0,0,0);
gbc.fill = gbc.HORIZONTAL;
p.add( jBtLayout, gbc );
gbc.fill = gbc.NONE;
p.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("ExtraControls"),
BorderFactory.createEmptyBorder(4,4,4,4) ) );
p.setPreferredSize( new Dimension(0, 0) );
final JToolBar jTbTools = new JToolBar();
jTbTools.setFloatable(false);
jTbTools.setLayout( new GridBagLayout() );
gbc.anchor = gbc.NORTHWEST;
gbc.gridwidth = gbc.REMAINDER;
gbc.insets = new Insets(0,0,0,0);
jTbTools.add(p,gbc);
gbc.gridwidth = 1;
jTbTools.add(m_jBtSave, gbc);
jTbTools.addSeparator(new Dimension(2,2));
jTbTools.add(jBtZoomIn, gbc);
gbc.fill = gbc.VERTICAL;
gbc.weighty = 1;
JPanel p2 = new JPanel(new BorderLayout());
p2.setPreferredSize( jTfZoom.getPreferredSize() );
p2.setMinimumSize( jTfZoom.getPreferredSize() );
p2.add(jTfZoom, BorderLayout.CENTER);
jTbTools.add(p2, gbc);
gbc.weighty =0;
gbc.fill = gbc.NONE;
jTbTools.add(jBtZoomOut, gbc);
jTbTools.addSeparator(new Dimension(2,2));
jTbTools.add(jBtExtraControls, gbc);
jTbTools.addSeparator(new Dimension(4,2));
gbc.weightx = 1;
gbc.fill = gbc.BOTH;
jTbTools.add(m_le.getProgressBar(), gbc);
jBtExtraControls.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ae) {
Dimension d = p.getPreferredSize();
if(d.width==0 || d.height==0) {
LayoutManager lm = p.getLayout();
Dimension d2 = lm.preferredLayoutSize(p);
p.setPreferredSize(d2); jTbTools.revalidate();
/* // this piece of code adds in an animation
// for popping out the extra controls panel
Thread th = new Thread() {
int h = 0, w = 0;
LayoutManager lm = p.getLayout();
Dimension d2 = lm.preferredLayoutSize(p);
int tow = (int)d2.getWidth(), toh = (int)d2.getHeight();
//toh = (int)d2.getHeight();
//tow = (int)d2.getWidth();
public void run() {
while(h<toh || w<tow) {
if((h+10)<toh)
h += 10;
else if(h<toh)
h = toh;
if((w+10)<tow)
w += 10;
else if(w<tow)
w = tow;
p.setPreferredSize(new Dimension(w, h));
//p.invalidate();
jTbTools.revalidate();
//paint(Temp4.this.getGraphics());
try {this.sleep(30);} catch(InterruptedException ie) {ie.printStackTrace(); break;}
}
p.setPreferredSize(new Dimension(tow,toh)); jTbTools.revalidate();
}
};
th.start();
*/
}
else {
p.setPreferredSize( new Dimension(0,0) );
jTbTools.revalidate();
/*
Thread th = new Thread() {
int h = p.getHeight(), w = p.getWidth();
LayoutManager lm = p.getLayout();
int tow = 0, toh = 0;
public void run() {
while(h>toh || w>tow) {
if((h-10)>toh)
h -= 10;
else if(h>toh)
h = toh;
if((w-10)>tow)
w -= 10;
else if(w>tow)
w = tow;
p.setPreferredSize(new Dimension(w, h));
//p.invalidate();
jTbTools.revalidate();
//paint(Temp4.this.getGraphics());
try {this.sleep(30);} catch(InterruptedException ie) {ie.printStackTrace(); break;}
}
p.setPreferredSize(new Dimension(tow,toh)); jTbTools.revalidate();
}
};
th.start();
*/
}
}
});
this.setLayout( new BorderLayout() );
this.add(jTbTools, BorderLayout.NORTH);
this.add(m_js, BorderLayout.CENTER);
}
/**
* This method sets the node size that is appropriate
* considering the maximum label size that is present.
* It is used internally when custom node size checkbox
* is unchecked.
*/
protected void setAppropriateNodeSize() {
int strWidth;
if(maxStringWidth==0)
for(int i=0; i<m_nodes.size(); i++) {
strWidth = fm.stringWidth(((GraphNode)m_nodes.elementAt(i)).lbl);
if(strWidth>maxStringWidth)
maxStringWidth=strWidth;
}
nodeWidth = maxStringWidth+4;
paddedNodeWidth = nodeWidth+8;
jTfNodeWidth.setText(""+nodeWidth);
nodeHeight = 2*fm.getHeight();
jTfNodeHeight.setText(""+nodeHeight);
}
/**
* Sets the preferred size for m_gp GraphPanel to the
* minimum size that is neccessary to display the graph.
*/
protected void setAppropriateSize() {
int maxX=0, maxY=0;
for(int i=0; i<m_nodes.size(); i++) {
GraphNode n = (GraphNode)m_nodes.elementAt(i);
if(maxX<n.x)
maxX=n.x;
if(maxY<n.y)
maxY=n.y;
}
//System.out.println("Scale: "+scale+" paddedWidth: "+paddedNodeWidth+" nodeHeight: "+nodeHeight+
// "\nmaxX: "+maxX+" maxY: "+maxY+" final: "+(int)((maxX+paddedNodeWidth+2)*scale)+","+
// (int)((maxY+nodeHeight+2)*scale) );
m_gp.setPreferredSize(new Dimension((int)((maxX+paddedNodeWidth+2)*scale),
(int)((maxY+nodeHeight+2)*scale)));
//System.out.println("Size set to "+this.getPreferredSize());
}
/**
* This method is an implementation for LayoutCompleteEventListener
* class. It sets the size appropriate for m_gp GraphPanel and
* and revalidates it's container JScrollPane once a
* LayoutCompleteEvent is received from the LayoutEngine.
*/
public void layoutCompleted(LayoutCompleteEvent le) {
setAppropriateSize();
//m_gp.clearBuffer();
m_gp.invalidate();
m_js.revalidate();
m_gp.repaint();
jBtLayout.setEnabled(true);
}
/**
* This method lays out the graph by calling the
* LayoutEngine's layoutGraph() method. This method
* should be called to display the graph nicely, unless
* the input XMLBIF03 already contains some layout
* information (ie the x,y positions of nodes.
*/
public void layoutGraph() {
if(m_le!=null)
m_le.layoutGraph();
}
/*********************************************************
*
* BIF reader<br>
* Reads a graph description in XMLBIF03 from a string
*
*********************************************************
*/
public void readBIF(String instring) throws BIFFormatException {
BIFParser bp = new BIFParser(instring, m_nodes, m_edges);
try {
graphID = bp.parse();
} catch(BIFFormatException bf) { System.out.println("BIF format error"); bf.printStackTrace(); }
catch(Exception ex) { ex.printStackTrace(); return; }
setAppropriateNodeSize();
if(m_le!=null) {
m_le.setNodeSize(paddedNodeWidth, nodeHeight);
}
} //end readBIF1
/**
*
* BIF reader<br>
* Reads a graph description in XMLBIF03 from an InputStrem
*
*
*/
public void readBIF(InputStream instream) throws BIFFormatException {
BIFParser bp = new BIFParser(instream, m_nodes, m_edges);
try {
graphID = bp.parse();
} catch(BIFFormatException bf) { System.out.println("BIF format error"); bf.printStackTrace(); }
catch(Exception ex) { ex.printStackTrace(); return; }
setAppropriateNodeSize();
if(m_le!=null) {
m_le.setNodeSize(paddedNodeWidth, nodeHeight);
}
setAppropriateSize();
} //end readBIF2
/*********************************************************
*
* Dot reader<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -