2011-03-16 8 views
1

ユーザがノードを作成し、それらの間にエッジを作成するアプレットを構築する必要があります。グラフを作成するためのJavaアプレット

これらのノードで処理するアルゴリズムを実行できます。

しかし、私はこれを作成する際に問題に直面しており、基本的にアプレットにアプローチして作成する方法を教えてくれる良いリンクが存在するかどうかを知りたいと思います。 .....

おかげでたくさん...

は、アプレットを作成するための優れたチュートリアルがありますが、それらは内部のGUI(ノード)を作成し、周りにそれらを動かすに多くを見てどこのいずれかが示唆でき

+2

** JUNG 2.0 Framework **をチェックしましたか?アプレットやJavaアプリでノードエッジグラフを作成することができます。[link](http://jung.sourceforge.net/) – eee

+0

@ link-eee可能であれば、私自身で完全に作りたいと思います。あなたの提案に感謝しますが、私はこれを標準ライブラリを使ってどうやってできるのかを学びたいと思っています。:) –

+0

@ user506710 - jung 2.0のソースはすべて開いています。私は描画ノード、レイアウトアルゴリズムなどを何にするかについて、かなり良いスタートと呼んでいます。 – Carl

答えて

2

ノードを保持するために何かが必要です:

 

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JPanel; 

/** 
* Displays the nodes and connections in the graph 
* @author dvargo 
*/ 
public class DisplayPanel extends JPanel 
{ 
    /** 
    * Holds the nodes in the graph 
    */ 
    List < Node > theNodes = new ArrayList(); 

    public DisplayPanel() 
    { 
     setBackground(Color.white); 
     repaint(); 
     setLayout(null); 

     //will redraw and new lines in the nodes automatically for you 
     new Thread(new Runnable() 
     { 
      public void run() 
      { 
       while (true) 
       { 
        drawConnections(); 
        try 
        { 
         Thread.sleep(100); 
        } 
        catch (Exception e) 
        { 

        } 
       } 
      } 
     }).start(); 
    } 

    /** 
    * Adds a node to the graph 
    * @param newNode The node to add 
    * @param xPosition The x Position in the graph to add it 
    * @param yPosition The y Position in the graph to add it 
    */ 
    public void add(Node newNode, int xPosition, int yPosition) 
    { 
     add(newNode); 
     newNode.setLocation(xPosition, yPosition); 
     theNodes.add(newNode); 
    } 

    /** 
    * Draw the connecting lines between nodes 
    */ 
    public void drawConnections() 
    { 
     Graphics g = getGraphics(); 
     for (Node currNode : theNodes) 
     { 
      for (Node currConnectedNode : currNode.getConnections()) 
      { 
       g.drawLine(currNode.getLocation().x, 
          currNode.getLocation().y, 
          currConnectedNode.getLocation().x, 
          currConnectedNode.getLocation().y); 
      } 
     } 
    } 
} 
 

次は実際のノードです。

 

import java.awt.Color; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

/** 
* Represents a node in the graph 
* @author dvargo 
*/ 
public class Node extends JPanel 
{ 
    /** 
    * Holds all the nodes this node is connected too 
    */ 
    List < Node > connections; 

    /** 
    * Displays the name of this node 
    */ 
    JLabel nameLabel; 

    /** 
    * Reference to the panel that is displaying these nodes 
    */ 
    DisplayPanel displayPanel; 

    /** 
    * Default constructor 
    * @param nodeName The name of this node 
    */ 
    public Node(final DisplayPanel displayPanel, String nodeName) 
    { 
     setBackground(Color.red); 
     this.displayPanel = displayPanel; 
     nameLabel = new JLabel(nodeName); 
     nameLabel.setVisible(true); 
     add(nameLabel); 
     connections = new ArrayList(); 

     //makes the nodes draggable 
     addMouseMotionListener(new MouseMotionAdapter() 
     { 
      public void mouseDragged(MouseEvent e) 
      { 
       setLocation(e.getX() + getLocation().x, 
         e.getY() + getLocation().y); 
       displayPanel.repaint(); 
      } 
     }); 

     setSize(50,50); 
     repaint(); 
    } 

    /** 
    * Change the name of the node 
    * @param newName The new name of the node 
    */ 
    public void setName(String newName) 
    { 
     nameLabel.setText(newName); 
    } 

    /** 
    * Get all the nodes this node is connected to 
    * @return List of nodes this node is connected too 
    */ 
    public List < Node > getConnections() 
    { 
     return connections; 
    } 

    /** 
    * Sets a connection between this node and another node 
    * @param newConnection The node to connect this node too 
    */ 
    public void addConnection(Node newConnection) 
    { 
     connections.add(newConnection); 
     //make sure the other node knows about this connection 
     if(newConnection.getConnections().contains(this) == false) 
     { 
      newConnection.addConnection(this); 
     } 
    } 

    /** 
    * Removes a connection with another node 
    * @param nodeToRemoveConnectionWith The nodes whose connection you could like 
    * to break 
    */ 
    public void removeConnection(Node nodeToRemoveConnectionWith) 
    { 
     connections.remove(nodeToRemoveConnectionWith); 
    } 

} 
 

これは、あなたがその、GraphPanelを見たいかもしれませんプログラム

 

import java.awt.GridLayout; 
import javax.swing.JFrame; 

/** 
* Runs the test program 
* @author dvargo 
*/ 
public class Main 
{ 
    public static void main(String [] args) 
    { 
     //build GUI 
     JFrame mainWindow = new JFrame(); 
     mainWindow.setSize(800,800); 
     mainWindow.setLayout(new GridLayout()); 

     DisplayPanel graphPanel = new DisplayPanel(); 
     mainWindow.add(graphPanel); 

     mainWindow.setVisible(true); 
     graphPanel.setVisible(true); 

     //create some nodes 
     Node a = new Node(graphPanel, "A"); 
     Node b = new Node(graphPanel, "B"); 
     Node c = new Node(graphPanel, "C"); 
     Node d = new Node(graphPanel, "D"); 
     Node e = new Node(graphPanel, "E"); 
     Node f = new Node(graphPanel, "F"); 

     a.setVisible(true); 
     b.setVisible(true); 
     c.setVisible(true); 
     d.setVisible(true); 
     e.setVisible(true); 
     f.setVisible(true); 

     //add them to their locations 
     graphPanel.add(a,0,0); 
     graphPanel.add(b,75,100); 
     graphPanel.add(c,400,300); 
     graphPanel.add(d,600,600); 
     graphPanel.add(e,45,600); 
     graphPanel.add(f,700,300); 

     //set the connections 
     a.addConnection(b); 
     a.addConnection(f); 
     b.addConnection(d); 
     b.addConnection(c); 
     b.addConnection(e); 
     c.addConnection(f); 
     e.addConnection(d); 

    } 

} 
 
+0

更新されました。ノードはドラッグ可能なので、移動することができます。私が言ったように、これはあなたができることの大まかなバージョンですが、あなたが少なくともatleastを始めることができるはずです。 – user489041

+0

ご不明な点がございましたら、お気軽にお問い合わせください。 – user489041

+0

希望はもっと投票を追加することができます:) ...ありがとうございました.... –

0

走る「エッジによって接続された可動、サイズ変更可能な、色のノードを備えています。」

関連する問題