我必须构建一个applet,用户在其中创建节点,然后在它们之间创建边缘。
然后我可以运行我的算法来处理这些节点。
但是我在创建这个问题时遇到了问题,并且想知道是否存在一些好的链接,这些链接基本上告诉我如何处理和创建applet。
有很好的创建applet的教程,但是你们中的任何人都可以建议他们在内部创建GUI(节点)并移动它们的地方......
非常感谢...
答案 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;