📄 treevisualizer.java
字号:
search_win.getContentPane().setLayout(null);
search_win.setSize(300, 200);
search_win.getContentPane().add(search_string);
search_win.getContentPane().add(case_sen);
search_string.setLocation(50, 70);
case_sen.setLocation(50, 120);
case_sen.setSize(100, 24);
search_string.setSize(100, 24);
//search_string.setVisible(true);
//case_sen.setVisible(true);
//search_win.setVisible(true);
*/
m_nodeMenu = new JPopupMenu();
/* A visualize choice for the node, may not be available. */
m_visualise = new JMenuItem("Visualize The Node");
m_visualise.setActionCommand("Visualize The Node");
m_visualise.addActionListener(this);
m_nodeMenu.add(m_visualise);
if (m_listener != null) {
m_remChildren = new JMenuItem("Remove Child Nodes");
m_remChildren.setActionCommand("Remove Child Nodes");
m_remChildren.addActionListener(this);
m_nodeMenu.add(m_remChildren);
m_classifyChild = new JMenuItem("Use Classifier...");
m_classifyChild.setActionCommand("classify_child");
m_classifyChild.addActionListener(this);
m_nodeMenu.add(m_classifyChild);
/*m_sendInstances = new JMenuItem("Add Instances To Viewer");
m_sendInstances.setActionCommand("send_instances");
m_sendInstances.addActionListener(this);
m_nodeMenu.add(m_sendInstances); */
}
m_focusNode = -1;
m_highlightNode = -1;
addMouseMotionListener(this);
addMouseListener(this);
//repaint();
//frame_limiter.setInitialDelay();
m_frameLimiter.setRepeats(false);
m_frameLimiter.start();
}
/**
* Constructs Displayer with the specified Node as the top
* of the tree, and uses the NodePlacer to place the Nodes.
* @param tdl listener.
* @param n the top Node of the tree to be displayed.
* @param p the algorithm to be used to position the nodes.
*/
public TreeVisualizer(TreeDisplayListener tdl, Node n, NodePlace p) {
//if the size needs to be automatically alocated I will do it here
setBorder(BorderFactory.createTitledBorder("Tree View"));
m_listener = tdl;
m_topNode = n;
m_placer = p;
m_placer.place(m_topNode);
m_viewPos = new Dimension(0, 0); //will be adjusted
m_viewSize = new Dimension(800, 600); //I allocate this now so that
//the tree will be visible
//when the panel is enlarged
m_nViewPos = new Dimension(0, 0);
m_nViewSize = new Dimension(800, 600);
m_scaling = 0;
m_numNodes = Node.getCount(m_topNode,0); //note the second argument
//must be a zero, this is a
//recursive function
m_numLevels = Node.getHeight(m_topNode,0);
m_nodes = new NodeInfo[m_numNodes];
m_edges = new EdgeInfo[m_numNodes-1];
arrayFill(m_topNode, m_nodes, m_edges);
changeFontSize(12);
m_mouseState = 0;
m_oldMousePos = new Dimension(0, 0);
m_newMousePos = new Dimension(0, 0);
m_frameLimiter = new Timer(120, this);
m_winMenu = new JPopupMenu();
m_topN = new JMenuItem("Center on Top Node"); //note to change
//language change this line
m_topN.setActionCommand("Center on Top Node"); //but not this
//one, same for all menu items
m_fitToScreen = new JMenuItem("Fit to Screen");
m_fitToScreen.setActionCommand("Fit to Screen");
//unhide = new JMenuItem("Unhide all Nodes");
m_selectFont = new JMenu("Select Font");
m_selectFont.setActionCommand("Select Font");
m_autoScale = new JMenuItem("Auto Scale");
m_autoScale.setActionCommand("Auto Scale");
m_selectFontGroup = new ButtonGroup();
m_accept = new JMenuItem("Accept The Tree");
m_accept.setActionCommand("Accept The Tree");
m_winMenu.add(m_topN);
m_winMenu.addSeparator();
m_winMenu.add(m_fitToScreen);
m_winMenu.add(m_autoScale);
m_winMenu.addSeparator();
//m_winMenu.add(unhide);
m_winMenu.addSeparator();
m_winMenu.add(m_selectFont);
m_winMenu.addSeparator();
if (m_listener != null) {
m_winMenu.add(m_accept);
}
m_topN.addActionListener(this);
m_fitToScreen.addActionListener(this);
//unhide.addActionListener(this);
m_autoScale.addActionListener(this);
m_accept.addActionListener(this);
m_size24 = new JRadioButtonMenuItem("Size 24",false);//,select_font_group);
m_size22 = new JRadioButtonMenuItem("Size 22",false);//,select_font_group);
m_size20 = new JRadioButtonMenuItem("Size 20",false);//,select_font_group);
m_size18 = new JRadioButtonMenuItem("Size 18",false);//,select_font_group);
m_size16 = new JRadioButtonMenuItem("Size 16",false);//,select_font_group);
m_size14 = new JRadioButtonMenuItem("Size 14",false);//,select_font_group);
m_size12 = new JRadioButtonMenuItem("Size 12",true);//,select_font_group);
m_size10 = new JRadioButtonMenuItem("Size 10",false);//,select_font_group);
m_size8 = new JRadioButtonMenuItem("Size 8",false);//,select_font_group);
m_size6 = new JRadioButtonMenuItem("Size 6",false);//,select_font_group);
m_size4 = new JRadioButtonMenuItem("Size 4",false);//,select_font_group);
m_size2 = new JRadioButtonMenuItem("Size 2",false);//,select_font_group);
m_size1 = new JRadioButtonMenuItem("Size 1",false);//,select_font_group);
m_size24.setActionCommand("Size 24");//,select_font_group);
m_size22.setActionCommand("Size 22");//,select_font_group);
m_size20.setActionCommand("Size 20");//,select_font_group);
m_size18.setActionCommand("Size 18");//,select_font_group);
m_size16.setActionCommand("Size 16");//,select_font_group);
m_size14.setActionCommand("Size 14");//,select_font_group);
m_size12.setActionCommand("Size 12");//,select_font_group);
m_size10.setActionCommand("Size 10");//,select_font_group);
m_size8.setActionCommand("Size 8");//,select_font_group);
m_size6.setActionCommand("Size 6");//,select_font_group);
m_size4.setActionCommand("Size 4");//,select_font_group);
m_size2.setActionCommand("Size 2");//,select_font_group);
m_size1.setActionCommand("Size 1");//,select_font_group);
m_selectFontGroup.add(m_size24);
m_selectFontGroup.add(m_size22);
m_selectFontGroup.add(m_size20);
m_selectFontGroup.add(m_size18);
m_selectFontGroup.add(m_size16);
m_selectFontGroup.add(m_size14);
m_selectFontGroup.add(m_size12);
m_selectFontGroup.add(m_size10);
m_selectFontGroup.add(m_size8);
m_selectFontGroup.add(m_size6);
m_selectFontGroup.add(m_size4);
m_selectFontGroup.add(m_size2);
m_selectFontGroup.add(m_size1);
m_selectFont.add(m_size24);
m_selectFont.add(m_size22);
m_selectFont.add(m_size20);
m_selectFont.add(m_size18);
m_selectFont.add(m_size16);
m_selectFont.add(m_size14);
m_selectFont.add(m_size12);
m_selectFont.add(m_size10);
m_selectFont.add(m_size8);
m_selectFont.add(m_size6);
m_selectFont.add(m_size4);
m_selectFont.add(m_size2);
m_selectFont.add(m_size1);
m_size24.addItemListener(this);
m_size22.addItemListener(this);
m_size20.addItemListener(this);
m_size18.addItemListener(this);
m_size16.addItemListener(this);
m_size14.addItemListener(this);
m_size12.addItemListener(this);
m_size10.addItemListener(this);
m_size8.addItemListener(this);
m_size6.addItemListener(this);
m_size4.addItemListener(this);
m_size2.addItemListener(this);
m_size1.addItemListener(this);
/*
search_string = new JTextField(22);
search_win = new JDialog();
case_sen = new JRadioButton("Case Sensitive");
search_win.getContentPane().setLayout(null);
search_win.setSize(300, 200);
search_win.getContentPane().add(search_string);
search_win.getContentPane().add(case_sen);
search_string.setLocation(50, 70);
case_sen.setLocation(50, 120);
case_sen.setSize(100, 24);
search_string.setSize(100, 24);
//search_string.setVisible(true);
//case_sen.setVisible(true);
search_win.setVisible(true);
*/
m_nodeMenu = new JPopupMenu();
/* A visualize choice for the node, may not be available. */
m_visualise = new JMenuItem("Visualize The Node");
m_visualise.setActionCommand("Visualize The Node");
m_visualise.addActionListener(this);
m_nodeMenu.add(m_visualise);
if (m_listener != null) {
m_remChildren = new JMenuItem("Remove Child Nodes");
m_remChildren.setActionCommand("Remove Child Nodes");
m_remChildren.addActionListener(this);
m_nodeMenu.add(m_remChildren);
m_classifyChild = new JMenuItem("Use Classifier...");
m_classifyChild.setActionCommand("classify_child");
m_classifyChild.addActionListener(this);
m_nodeMenu.add(m_classifyChild);
m_sendInstances = new JMenuItem("Add Instances To Viewer");
m_sendInstances.setActionCommand("send_instances");
m_sendInstances.addActionListener(this);
m_nodeMenu.add(m_sendInstances);
}
m_focusNode = -1;
m_highlightNode = -1;
addMouseMotionListener(this);
addMouseListener(this);
//repaint();
//frame_limiter.setInitialDelay();
m_frameLimiter.setRepeats(false);
m_frameLimiter.start();
}
/**
* Fits the tree to the current screen size. Call this after
* window has been created to get the entrire tree to be in view
* upon launch.
*/
public void fitToScreen() {
getScreenFit(m_viewPos, m_viewSize);
repaint();
}
/**
* Calculates the dimensions needed to fit the entire tree into view.
*/
private void getScreenFit(Dimension np, Dimension ns) {
int leftmost = 1000000, rightmost = -1000000;
int leftCenter = 1000000, rightCenter = -1000000, rightNode = 0;
int highest = -1000000, highTop = -1000000;
for (int noa = 0; noa < m_numNodes; noa++) {
calcScreenCoords(noa);
if (m_nodes[noa].m_center - m_nodes[noa].m_side < leftmost) {
leftmost = m_nodes[noa].m_center - m_nodes[noa].m_side;
}
if (m_nodes[noa].m_center < leftCenter) {
leftCenter = m_nodes[noa].m_center;
}
if (m_nodes[noa].m_center + m_nodes[noa].m_side > rightmost) {
rightmost = m_nodes[noa].m_center + m_nodes[noa].m_side;
}
if (m_nodes[noa].m_center > rightCenter) {
rightCenter = m_nodes[noa].m_center;
rightNode = noa;
}
if (m_nodes[noa].m_top + m_nodes[noa].m_height > highest) {
highest = m_nodes[noa].m_top + m_nodes[noa].m_height;
}
if (m_nodes[noa].m_top > highTop) {
highTop = m_nodes[noa].m_top;
}
}
ns.width = getWidth();
ns.width -= leftCenter - leftmost + rightmost - rightCenter + 30;
ns.height = getHeight() - highest + highTop - 40;
if (m_nodes[rightNode].m_node.getCenter() != 0
&& leftCenter != rightCenter) {
ns.width /= m_nodes[rightNode].m_node.getCenter();
}
if (ns.width < 10)
{
ns.width = 10;
}
if (ns.height < 10)
{
ns.height = 10;
}
np.width = (leftCenter - leftmost + rightmost - rightCenter) / 2 + 15;
np.height = (highest - highTop) / 2 + 20;
}
/**
* Performs the action associated with the ActionEvent.
*
* @param e the action event.
*/
public void actionPerformed(ActionEvent e) {
//JMenuItem m = (JMenuItem)e.getSource();
if (e.getActionCommand() == null) {
if (m_scaling == 0) {
repaint();
}
else {
animateScaling(m_nViewPos, m_nViewSize, m_scaling);
}
}
else if (e.getActionCommand().equals("Fit to Screen")) {
Dimension np = new Dimension();
Dimension ns = new Dimension();
getScreenFit(np, ns);
animateScaling(np, ns, 10);
}
else if (e.getActionCommand().equals("Center on Top Node")) {
int tpx = (int)(m_topNode.getCenter() * m_viewSize.width); //calculate
//the top nodes postion but don't adjust for where
int tpy = (int)(m_topNode.getTop() * m_viewSize.height); //view is
Dimension np = new Dimension(getSize().width / 2 - tpx,
getSize().width / 6 - tpy);
animateScaling(np, m_viewSize, 10);
}
else if (e.getActionCommand().equals("Auto Scale")) {
autoScale(); //this will figure the best scale value
//keep the focus on the middle of the screen and call animate
}
else if (e.getActionCommand().equals("Visualize The Node")) {
//send the node data to the visualizer
if (m_focusNode >= 0) {
Instances inst;
if ((inst = m_nodes[m_focusNode].m_node.getInstances()) != null) {
VisualizePanel pan = new VisualizePanel();
pan.setInstances(inst);
JFrame nf = new JFrame();
nf.setSize(400, 300);
nf.getContentPane().add(pan);
nf.setVisible(true);
}
else {
JOptionPane.showMessageDialog(this, "Sorry, there is no " +
"availble Instances data for " +
"this Node.", "Sorry!",
JOptionPane.WARNING_MESSAGE);
}
}
else {
JOptionPane.showMessageDialog(this, "Error, there is no " +
"selected Node to perform " +
"this operation on.", "Error!",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -