📄 treevisualizer.java
字号:
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 = m_topNode.getCount(m_topNode,0); //note the second argument //must be a zero, this is a //recursive function m_numLevels = m_topNode.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.show(); } 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!", JOptionPane.ERROR_MESSAGE); } } else if (e.getActionCommand().equals("Create Child Nodes")) { if (m_focusNode >= 0) { if (m_listener != null) { //then send message to the listener m_listener.userCommand(new TreeDisplayEvent (TreeDisplayEvent.ADD_CHILDREN, m_nodes[m_focusNode].m_node.getRefer())); } else { JOptionPane.showMessageDialog(this, "Sorry, there is no " + "available Decision Tree to " + "perform this operation on.", "Sorry!", JOptionPane.WARNING_MESSAGE); } } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -