ノードを保持するために何かが必要です:
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);
}
}
** JUNG 2.0 Framework **をチェックしましたか?アプレットやJavaアプリでノードエッジグラフを作成することができます。[link](http://jung.sourceforge.net/) – eee
@ link-eee可能であれば、私自身で完全に作りたいと思います。あなたの提案に感謝しますが、私はこれを標準ライブラリを使ってどうやってできるのかを学びたいと思っています。:) –
@ user506710 - jung 2.0のソースはすべて開いています。私は描画ノード、レイアウトアルゴリズムなどを何にするかについて、かなり良いスタートと呼んでいます。 – Carl