AWT Knoten für Graphen kreisförmig anordnen

D

dieEule

Gast
Hallo,

ich habe eine kleine Graphen-Applikation geschrieben mit zwei HashSets (Knoten und Kanten), bei der man z.B. Knoten hinzufügen, Kanten hinzufügen oder Knoten löschen kann (das wird alles über die Methoden in der Klasse Graph geregelt).
Dieses Programm soll nun eine GUI (Klasse View) bekommen, aber ich scheitere an der Anordnung der einzelnen Knoten. Ich möchte sie kreisförmig anordnen, damit sich die Kantenverbindungen nicht überlagern und gut sichtbar sind. Die Anzeige soll sich nach jeder neuen Eingabe aktualisieren und je mehr Knoten es werden, desto größer muss der Radius des Kreises werden.
Hat vielleicht jemand eine Idee, wie ich diese Anordnung möglichst einfach hinkriegen kann? Am besten ohne großen Aufwand mit Layout-Managern etc., da mich das als blutigen Anfänger noch etwas überfordert ;-)
Vielen Dank für eure Ideen! :)
dieEule
 

Marco13

Top Contributor
Graphen-Layout ist eine Wissenschaft für sich, aber das "Circle-Layout", was du angedeutet hast, ist wohl noch eins der einfachsten. LayoutManager haben damit natürlich nichts zu tun, aber man braucht schon eine Klasse, die aus einer Menge von Knoten ihre Positionen berechnet. Wie allgemein die sein sollte ... ist AUCH eine Wissenschaft für sich :D Gib vielleicht mal mehr Infos: Wer bestimmt bisher die Positionen? Wo werden die Positionen gespeichert (direkt im Knoten)? usw...
 
B

bygones

Gast
allein google liefert bei "Circle Layout" tausende Treffer...

wenn dich Layout Manager deiner Meinung nach ueberfordern, dann kannst du ein Circle Layout wegen der Komplexitaet mal knicken.

"Choose your battle" - entweder du machst so was komplexes und gehst den ganzen weg oder du suchst dir etwas einfacheres
 
D

dieEule

Gast
Die Knoten mit ihrer Position werden in der ArrayList<NodeData> gespeichert, NodeData ist nochmal eine extra Klasse.
Der Code sieht momentan so aus:

Java:
package application.gui;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import objects.Edge;
import objects.Graph;
import objects.Node;


public class View extends JFrame {

	private static final long serialVersionUID = 7094413965996596889L;
	private JFrame frame;
	private JPanel contentPane;
	private final Graph graph;
	private int currentX = 50;
	private int currentY = 50;
	private int stepX = 150;
	private int stepY = 20;
	private ArrayList<NodeData> nodeData; //hier sind Knoten+Position drin gespeichert


	public View(final Graph graph) {
		this.graph = graph;
		frame = new JFrame();
		frame.setBounds(100, 100, 1155, 403);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setTitle("Graphen");
		
		Container container = new Container();
		container.setLayout(null);
		
		//hier steht alles zum Menü, habe ich erstmal rausgenommen...
		frame.setJMenuBar(menuBar);
		
		contentPane = new JPanel();
		contentPane.setPreferredSize(new Dimension(frame.getWidth(), 400));
		contentPane.setBackground(Color.white);
		contentPane.setLayout(null);
		
		container.add(contentPane);
		frame.add(container);
		frame.setContentPane(contentPane);	
		frame.setVisible(true);
	}
	
	public void drawGraph() {	
		nodeData = new ArrayList<NodeData>();
		HashSet<Edge> edges = graph.getEdges();
		HashSet<Node> nodes = graph.getNodes();
		
		drawNodes(nodes);
		drawEdges(edges);
		repaint();
		
	}
	
	public void addEdge(String start, String end) {
		graph.insertEdge(start, end);
		drawGraph();
	}
	
	private void drawNodes(HashSet<Node> nodes) {
		Iterator<Node> i = nodes.iterator();
		while (i.hasNext()) {
			drawNode(i.next());
		}
	}
	
	private void drawEdges(HashSet<Edge> edges) {
		Iterator<Edge> i = edges.iterator();
		Edge tmpEdge;
		while (i.hasNext()) {
			tmpEdge = i.next();
			drawEdge(tmpEdge);
		}
	}
	
	private void drawEdge(Edge edge) {
		Graphics g = contentPane.getGraphics();
		NodeData predecessor = null;
		NodeData successor = null;
		
		for (int i=0; i<nodeData.size(); i++) {
			if (nodeData.get(i).getNode().equals(edge.getPredecessor())) {
				predecessor = nodeData.get(i);
			}
			if (nodeData.get(i).getNode().equals(edge.getSuccessor())) {
				successor = nodeData.get(i);
			}
		}

		g.drawLine(predecessor.getX() + 15, predecessor.getY() +15, successor.getX() + 15, successor.getY() + 15);
	}
	
	private void drawNode(Node node) {
		Graphics g = contentPane.getGraphics();
		g.setColor(Color.green);	//Knoten
		g.fillOval(currentX, currentY, 50, 50);
		g.setColor(Color.black);	//Beschriftung der Knoten
		g.setFont(new Font("Serif",Font.BOLD,30));
		g.drawString(new String(node.getValue()).toString(), currentX + 15, currentY + 36); 
		nodeData.add(new NodeData(node, currentX, currentY));
		currentX += stepX; // muss geändert werden!
		currentY += stepY; 	
	}
	
	private boolean isGraphNameOk(String name) {
		if (name.length() > 2 || name.equals("")) {
			return false;
		} 
		else {
		return true;
		}
	}
	
	public void startAddEdgeView() {
		AddEdgeView addEdgeView = new AddEdgeView(this);
		addEdgeView.setVisible(true);
		repaint();
	}
	
	public void paint(Graphics a) { 
		//drawGraph();
		//repaint();
	}
}



//Hier die Klassse NodeData:

package application.gui;

import objects.Node;

public class NodeData {
	private Node node;
	private int x;
	private int y;
	
	public NodeData(Node node, int x, int y) {
		this.node = node;
		this.x = x;
		this.y = y;
	}
	
	public Node getNode() {
		return node;
	}
	
	public int getX() {
		return x;
	}
	
	public int getY() {
		return y;
	}
}

Mit der paint()-Methode klappt auch nicht alles so, wie ich es mir gedacht habe, aber das ist erstmal egal ;)
Wichtig ist zunächst die richtige Anordnung der Knoten, die momentan einfach nur mit jeweils etwas Abstand dazwischen ausgegeben werden (stepX, stepY).
Wenn es mit dem kreisförmigen zu schwierig ist, geht auch eine andere Art der Anordnung, mir geht's erstmal nur darum, dass sich die Kanten nicht überlagern und man erkennt, welcher Knoten mit welchem verbunden ist :)
 

diggaa1984

Top Contributor
Wenn es mit dem kreisförmigen zu schwierig ist, geht auch eine andere Art der Anordnung

Die Frage ist: ist es dir zu schwierig?
Ausgangspunkt: Menge an Knoten und Kanten. Ausmaß eines einzelnen Knoten in der Darstellung

Du brauchst ja nun nur einen Kreisumfang berechnen welcher Platz für alle Darstellungen hat. Mit dem Umfang kannste dann den Radius des Kreises bestimmen. Nun brauchste nur deine ganzen Knoten auf 360° aufteilen, in Abhängigkeit des Radius' ne Position bestimmt eh voilà. Kanten von Knotenmittelpunkt zu Mittelpunkt (oder erst beginnend ab Darstellungsgrenzbereich der Knoten).

So in etwa stelle ich mir das vor, um das Kreislayout umzusetzen
 

jgh

Top Contributor
grundsätzlich macht man sowas nicht...
Java:
    private void drawNode(Node node) {
        Graphics g = contentPane.getGraphics();

man würde eher die
Code:
paintComponent(Graphics g){
überschreiben und dann deine Methoden aufrufen.
Idealerweise in einem JPanel, oder einer anderne Component...nicht die des JFrames.

also so:

Java:
@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		drawEdge(edge, g);//usw
		
	}
	  private void drawEdge(Edge edge, Graphics g) {
	        NodeData predecessor = null;
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Anzeige ID und Markierung für Knoten in Eclipse & Swing AWT, Swing, JavaFX & SWT 4
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
G JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
B Knoten, Kanten erzeugen AWT, Swing, JavaFX & SWT 4
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
D Erste Knoten des JTrees bei Start offen AWT, Swing, JavaFX & SWT 8
T TreeViewer knoten manuell umsortieren AWT, Swing, JavaFX & SWT 4
J Knotenselect von bestimmten Knoten im Tree AWT, Swing, JavaFX & SWT 2
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Knoten anzeigenb eim DnD in einem JTree AWT, Swing, JavaFX & SWT 4
H JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt AWT, Swing, JavaFX & SWT 3
Z Jtree Knoten ändern AWT, Swing, JavaFX & SWT 5
S JTree - Knoten mit animiertem GIF/Icon AWT, Swing, JavaFX & SWT 5
algorismi Knoten im JTree deaktivieren AWT, Swing, JavaFX & SWT 4
B JTree - pro Knoten kann nur ein Blatt eingefügt werden AWT, Swing, JavaFX & SWT 5
G JTree Knoten ein / ausblenden AWT, Swing, JavaFX & SWT 3
P JTree Knoten schliessen AWT, Swing, JavaFX & SWT 16
P Eindeutiger Knoten im Treeview AWT, Swing, JavaFX & SWT 3
S JTree rendern der Knoten [+] und [-], nicht der Node Icons AWT, Swing, JavaFX & SWT 2
G JTree: mehrere Knoten selektieren! AWT, Swing, JavaFX & SWT 2
S JTree, Knoten anhand eines Pfades öffnen? AWT, Swing, JavaFX & SWT 2
masta // thomas JTree - Knoten ausblenden. AWT, Swing, JavaFX & SWT 3
S Blätter oder Knoten im JTree ordnen AWT, Swing, JavaFX & SWT 3
D JTree - Knoten einfügen und automatisch in den Editiermodus AWT, Swing, JavaFX & SWT 2
G JTree -- Node nach ändern in anderen Knoten AWT, Swing, JavaFX & SWT 15
L nur den JTree Knoten auf der Console ausgeben? AWT, Swing, JavaFX & SWT 6
W JTree, bei Drag Over über den Knoten "markieren" AWT, Swing, JavaFX & SWT 3
S JTree hinzugefügte Knoten anzeigen AWT, Swing, JavaFX & SWT 9
K Frage zu einem älteren Beitrag: JTree letzter Knoten auswähl AWT, Swing, JavaFX & SWT 2
G Knoten im Jtree mit unterscheidlichen Farben darstellen AWT, Swing, JavaFX & SWT 5
S Knoten im JTree hinzufügen/löschen mit eigenem Jtree AWT, Swing, JavaFX & SWT 8
R JTree: TreeCellRenderer und Selektion eines Knoten AWT, Swing, JavaFX & SWT 10
G JTree - einzelnen Knoten löschen AWT, Swing, JavaFX & SWT 11
M Freiraum zwischen Knoten im JTree AWT, Swing, JavaFX & SWT 14
B Sichtbare Knoten im aktuellen Viewport eines JTree AWT, Swing, JavaFX & SWT 4
P JTree Knoten Öffnen - PER Programm AWT, Swing, JavaFX & SWT 5
D Knoten in JTree ausblenden. AWT, Swing, JavaFX & SWT 12
M JTree - Wie kann man einen einzelnen Knoten deselektieren? AWT, Swing, JavaFX & SWT 3
F Tree-Knoten programmgesteuert auswählen AWT, Swing, JavaFX & SWT 3
T Knoten in Jtree anders darstellen AWT, Swing, JavaFX & SWT 2
P JTree: Alle Knoten geöffnet anzeigen AWT, Swing, JavaFX & SWT 2
M Einen Knoten im JTree zusammenklappen? AWT, Swing, JavaFX & SWT 6
M JTree: Wie einen Knoten editieren? AWT, Swing, JavaFX & SWT 5
X JTree: Selektion nach dem Entfernen von Knoten AWT, Swing, JavaFX & SWT 2
W JTree Knoten oder Blatt AWT, Swing, JavaFX & SWT 3
W JTree löschen & überprüfen von Knoten oder Blatt AWT, Swing, JavaFX & SWT 3
W JTree Knoten irgendwo hinzufügen AWT, Swing, JavaFX & SWT 2
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
MJannek Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19

Ähnliche Java Themen

Neue Themen


Oben