Dynamisches Zeichnen von Grafikobjekten

Der Versuch, den besten Weg zu finden, um dies zu tun (und ohne irgendwelche Besonderheiten zu kreuzen, tun Sie NICHT Dinge, die ich nicht kenne).

Ich arbeite an der visuellen Darstellung eines Graphen (verschiedene Knoten, mit Kanten, die sie verbinden) mit Kreisen und Linien, um solche darzustellen. Jeder Knoten wird zur Laufzeit hinzugefügt, und ich kann dies nicht fest codieren. Soweit ich weiß, muss das gesamte Malen in der Methode paint (Graphics g) ausgeführt werden. Dies ist nicht hilfreich, da ich die Parameter nicht ändern kann und dies anscheinend nur während der ersten Erstellung aufgerufen wird.

Im Moment habe ich darüber nachgedacht, dass es verschiedene andere Methoden aufruft, das Graphics-Objekt übergibt und von anderen Variablen abhängt - ich werde entscheiden, ob ich das überhaupt aufrufen möchte (da die paint () -Methode die einzige ist, die ich aufrufen kann ).

Mache ich das völlig falsch? Das hat mich noch nie gestört.

Um Ihnen eine bessere Vorstellung davon zu geben, womit ich enden möchte: Ich möchte in der Lage sein, die Koordinaten der Form zu übergeben, die ich für den Knoten hinzufügen möchte, und sie dann zu allem hinzuzufügen, was ich bisher im Diagramm habe. Und genauso wie bei den Kanten möchte ich in der Lage sein, den Anfangs- und Endpunkt der Linie zu überschreiben, um sie auf das zu malen, was zu diesem Zeitpunkt vorhanden ist.

Nicht genau das, was ich gerade will - aber Sie werden die Idee von dem bekommen, was ich bisher zusammengefügt habe:

import java.awt.*;
import javax.swing.*;
public class MyCanvas extends Canvas
{
    public MyCanvas()
    {
    }
    public void paint(Graphics graphics)
    {
        // Keep this until I figured out if it's painted on load or not.
        graphics.drawLine(10, 20, 350, 380);
    }
    public static void main(String[] args)
    {
        MyCanvas canvas = new MyCanvas();
        JFrame frame = new JFrame();
        int vertexes = 0;
        // Change this next part later to be dynamic.
        vertexes = 10;
        int canvasSize = vertexes * vertexes;
        frame.setSize(canvasSize, canvasSize);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(canvas);
        frame.setVisible(true);
    }
    public void drawNode(int x, int y, Graphics g)
    {
            // Treat each location as a 10x10 block. If position 1,1 then go to (5,5) - If position 3,5 then go to (25, 45) eg: (x*10)-5, (y*10)-5 
            int xLoc = (x*10) - 5;
            int yLoc = (y*10) - 5;
            g.setColor(Color.white);
            g.fillOval(xLoc, yLoc, 8, 8);
            g.drawOval(xLoc, yLoc, 8, 8);
    }
    public void drawArc(int x, int y, int xx, int yy, Graphics g)
    {
            int xLoc = (x*10) - 5;
            int yLoc = (y*10) - 5;
            int xxLoc = (xx*10) - 5;
            int yyLoc = (yy*10) - 5;
            g.drawLine(xLoc, yLoc, xxLoc, yyLoc);
    }

}

Edit: (Antwort für Andrew)

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class MyCanvas extends JPanel
{

    public MyCanvas() {

    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    }

    public static void main(String[] args)
    { 
        int vertexes = 0;
        // Change this next part later to be dynamic.
        vertexes = 10;
        int canvasSize = vertexes * vertexes;

        JFrame frame = new JFrame();
        JLabel label = new JLabel();
        BufferedImage bImage = new BufferedImage(canvasSize, canvasSize, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = bImage.createGraphics();
        g2d.drawLine(50, 50, 300, 300);
        ImageIcon iIcon = new ImageIcon(bImage); 
        label.setIcon(iIcon);
        frame.add(label);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        g2d = drawNode(1,1,g2d);
        label.repaint();
    }

    public static Graphics2D drawNode(int x, int y,Graphics2D g2d)
    {
            // Treat each location as a 10x10 block. If position 1,1 then go to (5,5) - If position 3,5 then go to (25, 45) eg: (x*10)-5, (y*10)-5 
            int xLoc = (x*10) - 5;
            int yLoc = (y*10) - 5;
            g2d.setColor(Color.white);
            g2d.fillOval(xLoc, yLoc, 8, 8);
            g2d.drawOval(xLoc, yLoc, 8, 8);
            return g2d;
    }
    public static void drawArc(int x, int y, int xx, int yy)
    {
            int xLoc = (x*10) - 5;
            int yLoc = (y*10) - 5;
            int xxLoc = (xx*10) - 5;
            int yyLoc = (yy*10) - 5;
           // g.drawLine(xLoc, yLoc, xxLoc, yyLoc);
    }

}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage