Graph mit Swing zeichnen

ioannis_m

Mitglied
Hallo zusammen,

ich versuche einen Graphen mit numberV Knoten und numberE Kanten auf der Ebene zu zeichnen. Das Programm hängt gleich am Anfang ohne Fehlermeldung.

Java:
public interface Graph {
    int getV();
    int getE();
    boolean directed();
//    void insert(Edge e);
//    void remove(Edge e);
    boolean edge();
    AdjList getAdjList(int v);
}


Java:
import java.awt.Graphics;
import java.awt.Graphics2D;

public class SparseGraph implements Graph {


    private int numberV, numberE;
    private boolean digraph;
    private static class Node{
        int nodeName; Node next;
        Node(int nodeName, Node n){
            this.nodeName = nodeName; this.next = n;
        }
    }
   
    private static class Edge {
        int fromNodeName, toNodeName;
       
        Edge(int v, int w){
            this.fromNodeName = v;
            this.toNodeName = w;
        }
       
//        int v(){
//            return fromNodeName;
//        }
//       
//        int w(){
//            return toNodeName;
//        }

    }

   
    private Node adj[];
   
    public SparseGraph(int numberV, boolean flag) {
        this.numberV = numberV; digraph = flag;
        adj = new Node[numberV];
    }
    @Override
    public int getV() {
        return numberV;
    }

    @Override
    public int getE() {
        return numberE;
    }

    @Override
    public boolean directed() {
        return digraph;
    }

    public void insert(Edge givenEdge) {
        int fromNodeName = givenEdge.fromNodeName; int toNodeName = givenEdge.toNodeName;
        adj[fromNodeName] = new Node(toNodeName, adj[fromNodeName]);
        if (!directed())adj[toNodeName] = new Node(fromNodeName, adj[toNodeName]);
        numberE++;
    }

    public void remove(Edge givenEdge) {
        int fromNodeName = givenEdge.fromNodeName; int toNodeName = givenEdge.toNodeName;
       
       
        AdjLinkedList adjList = (AdjLinkedList) getAdjList(fromNodeName);// Search in the begNode list for endNode
        Node previousToCurrentNode = adjList.begNode();
       
        for (Node n = adjList.begNode();!adjList.end(); n = adjList.nextNode()){
            if (n.nodeName == toNodeName){
                previousToCurrentNode.next = n.next;    // Assign the current next Node to the previous next variable
                n.next = null;
            }
            previousToCurrentNode = n;
        }
       
        adjList = (AdjLinkedList) getAdjList(toNodeName);    // Search in the endNode list for begNode
        previousToCurrentNode = adjList.begNode();
       
        for (Node n = adjList.begNode();!adjList.end(); n = adjList.nextNode()){
            if (n.nodeName == fromNodeName){
                previousToCurrentNode.next = n.next;    // Assign the current next Node to the previous next variable
                n.next = null;
            }
            previousToCurrentNode = n;
        }
    }

    @Override
    public boolean edge() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public AdjList getAdjList(int v) {
        return new AdjLinkedList(v);
    }
        private class AdjLinkedList implements AdjList{
            private int v; private Node t;
            AdjLinkedList(int v) {
                this.v = v; t = null;
            }
            public int beg(){
                t = adj[v];
                return t == null ? -1 : t.nodeName;
            }
            public int next(){
                if (t != null) t = t.next;
                return t == null ? -1 : t.nodeName;
            }
            public boolean end(){
                return t == null;
            }
           
           
            public Node begNode(){
                t = adj[v];
                return t == null ? null : t;
            }
            public Node nextNode(){
                if (t != null) t = t.next;
                return t == null ? null : t;
            }
               
    }
       
    public Graph fillAndPlot(Graphics g, int numberE){
        Graphics2D g2 = (Graphics2D)g;
        this.numberE = numberE;
       
        for (int i = 0; i < getE(); i++){                // Fill the adj[numberV] array with random numberE edges
            int v = (int) (this.getV()*Math.random());
            int w = (int) (this.getV()*Math.random());
            this.insert(new Edge(v, w));
        }
       
        for (int v = 0; v < getV(); v++){                // Draw numberV random points
            int x1 = (int) (100*Math.random());
            int y1 = (int) (100*Math.random());
            g2.fillOval(x1, y1, 7, 7);
           
            AdjList a = getAdjList(v);                    // Draw numberE lines
            for (a.beg(); !a.end(); a.next()){
            int x2 = (int) (100*Math.random());
            int y2 = (int) (100*Math.random());
                g2.drawLine(x1, y1, x2, y2);
            }
        }
       
        return this;
    }
}


Java:
import java.awt.*;
import java.awt.Graphics2D;
import java.awt.geom.Arc2D;
import java.awt.geom.Line2D;
import java.awt.geom.QuadCurve2D;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class DrawingGraph extends JPanel{
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
//        g2.draw(new Line2D.Double(59.2d, 99.8d, 519.1d, 99.8d).getBounds());
//        g2.drawLine(120, 50, 360, 190);
//        g2.drawLine(180, 110, 500, 90);
        SparseGraph sparseGraph = new SparseGraph(5, false);
        sparseGraph.fillAndPlot(g2, 7);
//        g2.fillOval(150, 60, 7, 7);
//        System.out.println(this.getWidth());
//        g2.draw(new QuadCurve2D.Double(59.2d, 99.8d, 519.1d, 99.8d, 30, 30));
   
    }
private static void createAndShowGUI(){
    JFrame f = new JFrame("Demo");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(600, 200);
    f.add(new DrawingGraph());
    f.setVisible(true);
    }

public static void main(String args[]){
    Runnable doCreateAndShowGUI = new Runnable(){
        public void run(){
            createAndShowGUI();
        }
    };
    SwingUtilities.invokeLater(doCreateAndShowGUI);
    }
}


Wäre für jeden Rat dankbar...

mfg
ioannis
 

Robat

Top Contributor
Hey ioannis,

versuch mal mit dem Debugger zu arbeiten und raus zukriegen, wo dein Programm sich aufhängt. Dann könntest du uns mitteilen an welcher Stelle es ist, da es so recht schwer ist das raus zu finden.

Und einfach aus persönlichen Gründen mal die Frage:
Was ist AdjList ?

Gruß
Robert
 

Meniskusschaden

Top Contributor
Das hier sieht ziemlich verdächtig aus:
Java:
        for (int i = 0; i < getE(); i++) { // Fill the adj[numberV] array with
                                            // random numberE edges
            int v = (int) (this.getV() * Math.random());
            int w = (int) (this.getV() * Math.random());
            this.insert(new Edge(v, w));
        }
Du fügst offenbar ohne Bedingung bei jedem Schleifendurchlauf eine neue Kante ein, so dass i niemals größer oder gleich getE() werden kann.
 

ioannis_m

Mitglied
Hallo Robert,

die Datenstruktur hinter diesem dünnbesiedelten Graph ist eine array aus Listen, die die anschliessenden Knoten eines jeden Knoten repräsentieren sollen. AdjList ist der iterator der Klasse, der genau diese Knoten züruckgibt.

Ich habe die Methode print() hinzugefügt, das Problem scheint in der SparseGraph Klasse zu sein.

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;

public class SparseGraph implements Graph {


    private int numberV, numberE;
    private boolean digraph;
    private static class Node{
        int nodeName; Node next;
        Node(int nodeName, Node n){
            this.nodeName = nodeName; this.next = n;
        }
    }
   
    private static class Edge {
        int fromNodeName, toNodeName;
       
        Edge(int v, int w){
            this.fromNodeName = v;
            this.toNodeName = w;
        }
       
//        int v(){
//            return fromNodeName;
//        }
//       
//        int w(){
//            return toNodeName;
//        }

    }

   
    private Node adj[];
   
    public SparseGraph(int numberV, boolean flag) {
        this.numberV = numberV; digraph = flag;
        adj = new Node[numberV];
    }
    @Override
    public int getV() {
        return numberV;
    }

    @Override
    public int getE() {
        return numberE;
    }

    @Override
    public boolean directed() {
        return digraph;
    }

    public void insert(Edge givenEdge) {
        int fromNodeName = givenEdge.fromNodeName; int toNodeName = givenEdge.toNodeName;
        adj[fromNodeName] = new Node(toNodeName, adj[fromNodeName]);
        if (!directed())adj[toNodeName] = new Node(fromNodeName, adj[toNodeName]);
        numberE++;
    }

    public void remove(Edge givenEdge) {
        int fromNodeName = givenEdge.fromNodeName; int toNodeName = givenEdge.toNodeName;
       
       
        AdjLinkedList adjList = (AdjLinkedList) getAdjList(fromNodeName);// Search in the begNode list for endNode
        Node previousToCurrentNode = adjList.begNode();
       
        for (Node n = adjList.begNode();!adjList.end(); n = adjList.nextNode()){
            if (n.nodeName == toNodeName){
                previousToCurrentNode.next = n.next;    // Assign the current next Node to the previous next variable
                n.next = null;
            }
            previousToCurrentNode = n;
        }
       
        adjList = (AdjLinkedList) getAdjList(toNodeName);    // Search in the endNode list for begNode
        previousToCurrentNode = adjList.begNode();
       
        for (Node n = adjList.begNode();!adjList.end(); n = adjList.nextNode()){
            if (n.nodeName == fromNodeName){
                previousToCurrentNode.next = n.next;    // Assign the current next Node to the previous next variable
                n.next = null;
            }
            previousToCurrentNode = n;
        }
    }

    @Override
    public boolean edge() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public AdjList getAdjList(int v) {
        return new AdjLinkedList(v);
    }
        private class AdjLinkedList implements AdjList{
            private int v; private Node t;
            AdjLinkedList(int v) {
                this.v = v; t = null;
            }
            public int beg(){
                t = adj[v];
                return t == null ? -1 : t.nodeName;
            }
            public int next(){
                if (t != null) t = t.next;
                return t == null ? -1 : t.nodeName;
            }
            public boolean end(){
                return t == null;
            }
           
           
            public Node begNode(){
                t = adj[v];
                return t == null ? null : t;
            }
            public Node nextNode(){
                if (t != null) t = t.next;
                return t == null ? null : t;
            }
               
    }
       
    private void fill(int numberE){
        this.numberE = numberE;
       
        for (int i = 0; i < getE(); i++){                // Fill the adj[numberV] array with random numberE edges
            int v = (int) (this.getV()*Math.random());
            int w = (int) (this.getV()*Math.random());
            this.insert(new Edge(v, w));
        }

    }
       
    public Graph fillAndPlot(Graphics g, int numberE){
        Graphics2D g2 = (Graphics2D)g;
        fill(numberE);

        for (int v = 0; v < getV(); v++){                // Draw numberV random points
            int x1 = (int) (100*Math.random());
            int y1 = (int) (100*Math.random());
            g2.fillOval(x1, y1, 7, 7);
           
            AdjList a = getAdjList(v);                    // Draw numberE lines
            for (a.beg(); !a.end(); a.next()){
            int x2 = (int) (100*Math.random());
            int y2 = (int) (100*Math.random());
                g2.drawLine(x1, y1, x2, y2);
            }
        }
       
        return this;
    }
   
    public void print(){
        for (int i = 0; i < getV(); i++){
            System.out.print(i + ": ");
            AdjList a = getAdjList(i);
            for (int j = a.beg(); !a.end(); j = a.next()){
                System.out.print(j + " ");
            }
            System.out.println("");
        }
    }
   
    public static void main (String args[]){
        SparseGraph sG = new SparseGraph(20, false);
        System.out.println(sG.numberV);
        sG.fill(34);
        System.out.println(sG.numberE);
//        sG.print();
    }
}

Mit der Zeile

Java:
        sG.fill(34);

bekomme ich die Fehlermeldung

Java:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at SparseGraph.insert(SparseGraph.java:58)
    at SparseGraph.fill(SparseGraph.java:135)
    at SparseGraph.main(SparseGraph.java:174)
 

Robat

Top Contributor
Also,..

Die Ecception sollte relative selbsterklärend sein, deswegen geh ich da jetzt nicht weiter drauf ein.

Habe jetzt dein QC fix überflogen und gesehen, dass du relative viele Objekte erzeugst. Das kann ein Grund sein warum du auf diese Exception stößt.
Versuch mal dein QC durch zu gehen und Instanzen die du nicht brauchst zu löschen Sodass du unnötigen Speicher frei machst.

Für weitere Infos einfach mal outofmemory exception bei Google eingeben ;-)
 

ioannis_m

Mitglied
Hallo Meniskusschaden,

ich übergebe der Methode den Parameter numberE und somit setze ich die Instanzvariable numberE, die wiederum getE() zurückgibt (-eben sollte?)..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
D Canvas oder scene graph? AWT, Swing, JavaFX & SWT 16
ralfb1105 Swing Dynamischer Graph zum anzeigen Perfomance Daten AWT, Swing, JavaFX & SWT 35
K Aus 2 Arrays xy - Graph erstellen AWT, Swing, JavaFX & SWT 9
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
D gerichteten Graph erstellen AWT, Swing, JavaFX & SWT 2
H 2D-Grafik Bibliothek um Graph\Baum zu erstellen AWT, Swing, JavaFX & SWT 2
K Graph erstellen AWT, Swing, JavaFX & SWT 3
S Graph zeichnen bei Mausklick AWT, Swing, JavaFX & SWT 4
S Balkendiagramm und XY-Graph in einem Chart? AWT, Swing, JavaFX & SWT 2
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben