⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphconstructionpanel.java

📁 基于MPEG 7 标准,符合未来语义网架构,很值得参考
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                embedderThread.stopEmbedding();
                embedderThread.join();
                embedderThread = null;
            }
            removeEdge(edge);
            embedder = new SpringEmbedder(semanticObjects, semanticRelations);
            embedGraph();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * Use when embedder is stoppeg, eg. from inside removeNode()
     *
     * @param edge
     */
    private void removeEdge(LabeledEdge edge) {
        semanticRelations.remove(edge);
//        embedder = new SpringEmbedder(semanticObjects, semanticRelations);
//        embedGraph();
    }

    public void addRelation(String label, LabeledNode src, LabeledNode tgt) {
        semanticRelations.add(new LabeledEdge(src, tgt, label));
        embedder = new SpringEmbedder(semanticObjects, semanticRelations);
        embedGraph();
    }

    public void addRelation(String label, String src, String tgt) {
        semanticRelations.add(new LabeledEdge(label2Node.get(src), label2Node.get(tgt), label));
        embedder = new SpringEmbedder(semanticObjects, semanticRelations);
        embedGraph();
    }

    public void embedGraph() {
        if (embedderThread != null) {
            embedderThread.stopEmbedding();
            try {
                embedderThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if (semanticObjects.size() > 3) {
            embedderThread = new EmbedderThread(embedder, this);
            embedderThread.start();
        } else
            repaint();
    }

    /**
     * Invoked when the mouse button has been clicked (pressed
     * and released) on a component.
     */
    public void mouseClicked(MouseEvent e) {
        if ((e.getButton() == MouseEvent.BUTTON2) || (e.getButton() == MouseEvent.BUTTON3 && e.isAltDown())) {
            double x = e.getPoint().x;
            double y = e.getPoint().y;
            // check for nodes ...
            for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
                Point2D.Double p = iterator.next();
                if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
                    removeNode(point2node.get(p).getLabel());
                }
            }
            // check for relations:
            LabeledEdge toRemove = null;
            for (Iterator<Arrow> iterator = shape2edge.keySet().iterator(); iterator.hasNext();) {
                Arrow arrow = iterator.next();
                if (arrow.contains(e.getPoint())) {
                    toRemove = shape2edge.get(arrow);
                }
            }
            if (toRemove != null) removeRelation(toRemove);
        } else if (e.getButton() == MouseEvent.BUTTON3) {
            double x = e.getPoint().x;
            double y = e.getPoint().y;
            // check for nodes ...
            for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
                Point2D.Double p = iterator.next();
                if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
                    currentNode = point2node.get(p);
                    JPopupMenu menu = new JPopupMenu();
                    java.util.List<String> nodes = getNodes(currentNode.getLabel());
                    for (Iterator<String> it = nodes.iterator(); it.hasNext();) {
                        String label = it.next();
                        JMenuItem menuItem = new JMenuItem(label);
                        menuItem.addActionListener(this);
                        menuItem.setActionCommand("setLabel|" + label);
                        menu.add(menuItem);
                    }
                    if (nodes.size() > 0) menu.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        }
    }

    /**
     * Invoked when a mouse button has been pressed on a component.
     */
    public void mousePressed(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            lastClickedLabel = null;
            lastClickedPoint = null;
            double x = e.getPoint().x;
            double y = e.getPoint().y;
            for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
                Point2D.Double p = iterator.next();
                if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
                    lastClickedLabel = point2node.get(p).getLabel();
                    lastClickedPoint = p;
                }
            }
        }
    }

    /**
     * Invoked when a mouse button has been released on a component.
     */
    public void mouseReleased(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            double x = e.getPoint().x;
            double y = e.getPoint().y;
            String tgtLabel = null;
            for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
                Point2D.Double p = iterator.next();
                if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
                    tgtLabel = point2node.get(p).getLabel();
                    if (!tgtLabel.equals(lastClickedLabel)) {
                        // add new Relation:
                        Object label = JOptionPane.showInputDialog(this, "Please specify relation:", "Add semantic relation",
                                JOptionPane.PLAIN_MESSAGE, null, relationArray, relationArray[0]);

                        addRelation(label.toString(), lastClickedLabel, tgtLabel);
                    }
                }
            }
            lastClickedLabel = null;
            lastClickedPoint = null;
            lastDraggedLine = null;
            repaint();
        }
    }

    /**
     * Invoked when the mouse enters a component.
     */
    public void mouseEntered(MouseEvent e) {

    }

    /**
     * Invoked when the mouse exits a component.
     */
    public void mouseExited(MouseEvent e) {

    }

    /**
     * Invoked when a mouse button is pressed on a component and then
     * dragged.  <code>MOUSE_DRAGGED</code> events will continue to be
     * delivered to the component where the drag originated until the
     * mouse button is released (regardless of whether the mouse position
     * is within the bounds of the component).
     * <p/>
     * Due to platform-dependent Drag&Drop implementations,
     * <code>MOUSE_DRAGGED</code> events may not be delivered during a native
     * Drag&Drop operation.
     */
    public void mouseDragged(MouseEvent e) {
        lastDraggedLine = null;
        if (lastClickedLabel != null && lastClickedPoint != null) {
            lastDraggedLine = new Line2D.Double(e.getPoint(), lastClickedPoint);
            repaint();
        }
    }

    /**
     * Invoked when the mouse cursor has been moved onto a component
     * but no buttons have been pushed.
     */
    public void mouseMoved(MouseEvent e) {

    }

    /**
     * Creates the search string for searching in the graph list.
     * @return
     */
    public String getSearchString() {
        StringBuilder sb = new StringBuilder(64);
        int count = 1;
        HashMap<String, Integer> label2position = new HashMap<String, Integer>(semanticObjects.size());
        for (Iterator<LabeledNode> iterator = semanticObjects.iterator(); iterator.hasNext();) {
            LabeledNode node = iterator.next();
            String label = node.getLabel();
            // for emir: replace all numbers, which are in brackets :)
            label = label.replaceAll(" \\x28\\d\\x29", "");
            sb.append('[');
            sb.append(label);
            sb.append(']');
            sb.append(' ');
            label2position.put(node.getLabel(), count);
            count++;
        }
        for (Iterator<LabeledEdge> iterator = semanticRelations.iterator(); iterator.hasNext();) {
            LabeledEdge edge = iterator.next();
//            sb.append('[');
            String label = edge.getLabel();
            if (label.indexOf('*') > -1) label = "\\w*";
            sb.append(label);
            sb.append(' ');
            LabeledNode src = (LabeledNode) edge.getStartNode();
            sb.append(label2position.get(src.getLabel()));
            sb.append(' ');
            LabeledNode tgt = (LabeledNode) edge.getEndNode();
            sb.append(label2position.get(tgt.getLabel()));
//            sb.append(']');
            sb.append(' ');
        }
        return sb.toString().trim();
    }

    /**
     * simple method to create a search string for searching within the 2-path index.
     * @return
     */
    public String getPathSearchString() {
        StringBuilder sb = new StringBuilder(256);
        int count = 1;
        HashMap<String, Integer> label2position = new HashMap<String, Integer>(semanticObjects.size());
        for (Iterator<LabeledNode> iterator = semanticObjects.iterator(); iterator.hasNext();) {
            LabeledNode node = iterator.next();
            String label = node.getLabel();
            if (label.startsWith(GraphSearchPanel.ANONYMOUS_NODE_NAME)) {
                label = "*";
            }
            // for emir: replace all numbers, which are in brackets :)
            label = label.replaceAll(" \\x28\\d\\x29", "");
            sb.append('[');
            sb.append(label);
            sb.append(']');
            sb.append(' ');
            label2position.put(node.getLabel(), count);
            count++;
        }
        for (Iterator<LabeledEdge> iterator = semanticRelations.iterator(); iterator.hasNext();) {
            LabeledEdge edge = iterator.next();
            String label = edge.getLabel();
            if (label.indexOf("*") > -1) label = "*";
            sb.append(label);
            sb.append(' ');
            LabeledNode src = (LabeledNode) edge.getStartNode();
            sb.append(label2position.get(src.getLabel()));
            sb.append(' ');
            LabeledNode tgt = (LabeledNode) edge.getEndNode();
            sb.append(label2position.get(tgt.getLabel()));
            sb.append(' ');
        }
        return sb.toString().trim();
    }

    public java.util.List<String> getNodes(String label) {
        if (retrievalEngine == null) {
            retrievalEngine = (LuceneRetrievalEngine) RetrievalEngineFacotry.getLuceneRetrievalEngine();
        }
        java.util.List<String> result = new LinkedList<String>();
        java.util.List<Node> nodeList = retrievalEngine.getNodes(label, RetrievalFrame.BASE_DIRECTORY);
        for (Iterator<Node> iterator = nodeList.iterator(); iterator.hasNext();) {
            Node node = iterator.next();
            result.add(node.getLabel());
        }
        return result;
    }

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        if (cmd.startsWith("setLabel|")) {
            String newLabel = cmd.substring("setLabel|".length());
            // remove old node in label table
            label2Node.remove(currentNode.getLabel());
            // add it with new label:
            newLabel = "\""+ newLabel + "\"";
            label2Node.put(newLabel, currentNode);
            currentNode.setLabel(newLabel);
            repaint();
        }
    }
}

class EmbedderThread extends Thread {
    private SpringEmbedder embedder;
    private boolean embedderRunning = true;
    private JPanel parent;

    public EmbedderThread(SpringEmbedder embedder, JPanel parent) {
        this.embedder = embedder;
        this.parent = parent;
    }

    public void run() {
        while (embedderRunning && embedder.step() > 0) {
            parent.repaint();
            try {
                sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // Thread.currentThread().wait(40);
        }
    }

    public void stopEmbedding() {
        embedderRunning = false;
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -