1

I have to build an applet where the user creates nodes and then creates edges between them.

Then I can run my algorithm for processing on these nodes.

However I am facing problems in creating this and would like to know if there exist some good links which essentially tells me how to approach and create the applet.

There are good tutorials for creating applet but could any of you suggest where they look more into creating GUI(nodes) inside and moving them around.....

Thanks a lot...

3
  • 2
    Have you checked JUNG 2.0 Framework? It can create node-edge graph either in applet or Java app link Commented Mar 16, 2011 at 16:47
  • @link-eee I would like to make it completely on my own if possible .... So thanks for your suggestion but I would like to learn how can i do this just using the standard libraries... :) Commented Mar 16, 2011 at 16:49
  • @user506710 - the jung 2.0 source is all open. I'd call that a pretty good start on what to do drawing nodes, layout algorithms, etc. Commented Mar 16, 2011 at 19:01

2 Answers 2

2

You will need something to hold the nodes:


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);
            }
        }
    }
}

Next is the actual node.


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);
    }

}

This runs the program


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);

    }

}

Sign up to request clarification or add additional context in comments.

2 Comments

Updated. The nodes are draggable in this so you can move them around. Like I said though, this is just a rough version of what you could do but should be able to get you started atleast.
If you have any questions on it, feel free to ask.
0

You might like to look at GraphPanel, which "features moveable, resizable, colored nodes connected by edges."

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.