用于创建图形的java applet

时间:2011-03-16 16:40:47

标签: java applet

我必须构建一个applet,用户在其中创建节点,然后在它们之间创建边缘。

然后我可以运行我的算法来处理这些节点。

但是我在创建这个问题时遇到了问题,并且想知道是否存在一些好的链接,这些链接基本上告诉我如何处理和创建applet。

有很好的创建applet的教程,但是你们中的任何人都可以建议他们在内部创建GUI(节点)并移动它们的地方......

非常感谢...

2 个答案:

答案 0 :(得分: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);
    }

}

这会运行程序


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

    }

}

答案 1 :(得分:0)

您可能希望查看GraphPanel,其中&#34;具有可通过边缘连接的可移动,可调整大小的彩色节点。&#34;