Graphics2D - Verbinden zweier Punkte

Soloeco

Aktives Mitglied
Moin,

ich arbeite aktuell an einem Projekt und möchte dabei folgendes tun:
- Ein JFrame erstellen
- Darauf Punkte einzeichnen an variabel bestimmbaren Koordinaten
- Diese Punkte jeweils mit einer geraden Linie verbinden

Wie ich eine Linie und einen Punkt erstelle weiß ich, hier dazu mein Code:
Java:
package SimulationView;

import java.awt.Graphics;
import javax.swing.JPanel;

public class LinePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(10, 10, 1000, 50);
    }
}

Java:
package SimulationView;

import java.awt.Graphics;

import javax.swing.JPanel;

public class CirclePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillOval(10, 10, 20, 20);
    }
}

Hier noch der relevante Code meines Fensters:
Java:
private void initiateFrame() {
        mainFrame = new JFrame("Frame");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        mainFrame.setLayout(new BorderLayout());
       
        initiateCenter();
       
        mainFrame.setVisible(true);
    }
   
    private void initiateCenter() {
        mainFrame.add(new CirclePanel(), BorderLayout.CENTER);
        mainFrame.add(new LinePanel(), BorderLayout.CENTER);       
    }

Dann zu meinen Fragen ... Kann mir jemand die Theorie erklären, wie ich nun Variabel mehrere Punkte an verschiedenen Koordinaten setzen kann, welche ich dann mit einer Linie verbinde?
Des Weiteren besteht ein Problem bei dem sichtbar machen. Beim hinzufügen des Kreises und der Linie, wird immer nur das angezeigt, was ich als letztes hinzufüge zu dem frame, woran liegt das und wie kann ich das beheben?
Brauche nur einen Denkanstoß ... Wäre sehr lieb wenn mir jemand weiterhelfen kann oder weitere Tipps gibt!

Freundliche Grüße 🙂
 
Du musst alles in einem Panel zeichnen, ansonsten überdeckt das LinePanel den CirclePanel.
Zu dem Verbinden von Punkten: Jeder Endpunkt einer Linie ist der neue Startpunkt einer neuen Linie.
So bekommst du eine durchgehende Linie bestehend aus vielen Punkten.
 
Danke @HarleyDavidson ! Allerdings habe ich noch eine weitere Frage zu dem Verbinden dann. Und zwar, wie kann ich denn auf die Koordinaten der jeweiligen Punkte zugreifen? Ich meine, die Linie muss ja so zu sagen wissen, wo der Start und wo der Endpunkt ist.
 
Naja, die Koordinaten für die Punkte müssen ja bekannt sein.
Als Klasse bietet sich hier "java.awt.Point" an.
Übergib ein Array (oder Liste o.ä.) an die paintComponent-Methode und dann kannst du die Linien in einer Schleife zeichnen lassen.
 
Hier mal ein kleines Beispiel:
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author Dominik Sust
 * @creation 07.06.2017 07:45:05
 */
public class DrawTest
{
    Point[] points = new Point[]
    {
       new Point(10, 10),
        new Point(300, 30),
        new Point(450, 250),
        new Point(200, 200),
        new Point(40, 350),
        new Point(20, 125),
        new Point(10, 10)
    };

    public static void main( String[] args )
    {
        new DrawTest().work();
    }

    private void work()
    {
        JFrame frame = new JFrame( "DrawTest" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        JPanel panel = new JPanel()
        {
            @Override
            protected void paintComponent( Graphics g )
            {
                super.paintComponent( g ); //To change body of generated methods, choose Tools | Templates.
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor( Color.BLACK );
                for ( int i = 0; i < points.length; i++ )
                {
                    //Wir befinden uns noch nicht am letzten Punkt
                    if (i < points.length-1)
                    {
                        Point start = points[i];
                        Point ende = points[i+1];
                        g2d.drawLine( start.x, start.y, ende.x, ende.y );
                    }
                }

            }

        };
        panel.setPreferredSize( new Dimension( 500, 500 ) );
        frame.setContentPane( panel );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }
}
 

Zurück
Oben