JFrame, Linien zeichnen, MouseListener

Diskutiere JFrame, Linien zeichnen, MouseListener im Java Basics - Anfänger-Themen Bereich.
P

Paul3636

Hallo ich hoffe ihr könnt mir weiter helfen. Ich bin ziemlich neu in dem Gebiet und muss eine HA abgeben, die Folien der Vorlesung helfen mir leider nicht viel weiter :(
Ich soll ein Programm schreiben, welches Mithilfe der Maus Linien zeichnet. Es sollen mehrere Linien gezeichnet werden können.
Mit einem Button "New" soll die Zeichenfläche gelöscht werden und es sollen keine Linien mehr zu sehen sein.
Mit einem Button "End" soll ein modaler Dialog erscheinen, der eine Bestätigung für das Ende des Programms abfragt. Bei Antwort "Yes" wird das Programm beendet bei Antwort "No" kehrt man zum Programm zurück
Das habe ich bis jetzt:



Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

public class Linien {
    public static void main(String args[]) throws Exception {
        JFrame f = new JFrame("Linien");
        f.setSize(300, 300);
        f.setLocation(300, 300);
        f.setResizable(false);
        JPanel p = new JPanel() {
            Point pointStart = null;
            Point pointEnd   = null;
            {
                addMouseListener(new MouseAdapter() {
                    public void mousePressed(MouseEvent e) {
                        pointStart = e.getPoint();
                    }

                    public void mouseReleased(MouseEvent e) {
                        pointStart = null;
                    }
                });
                addMouseMotionListener(new MouseMotionAdapter() {
                    public void mouseMoved(MouseEvent e) {
                        pointEnd = e.getPoint();
                    }

                    public void mouseDragged(MouseEvent e) {
                        pointEnd = e.getPoint();
                        repaint();
                    }
                });
            }
            public void paint(Graphics g) {
                super.paint(g);
                if (pointStart != null) {
                    g.setColor(Color.RED);
                    g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
                }
            }
        };
        f.add(p);
        f.setVisible(true);
    }
}
 
Zuletzt bearbeitet:
mihe7

mihe7

Es ist ja schön, dass Du uns das erzählst aber gibt es dazu auch eine Frage? :)
 
MoxxiManagarm

MoxxiManagarm

Fixed. Anmerkungen inline

Java:
public class Linien {
    public static void main(String args[]) throws Exception {
        JFrame f = new JFrame("Linien");
        f.setSize(300, 300);
        f.setLocation(300, 300);
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // sonst beendet das Programm nicht richtig (kannst du noch im Taskmanager finden)

        JPanel p = new JPanel() {
            List<Line2D.Double> lines = new ArrayList<>(); // du musst dir auch die zuvorgemalten Linien speichern

            Point pointStart = null;
            Point pointEnd   = null;

            {
                addMouseListener(new MouseAdapter() {
                    public void mousePressed(MouseEvent e) {
                        pointStart = e.getPoint();
                        pointEnd = e.getPoint();
                    }

                    public void mouseReleased(MouseEvent e) {
                        lines.add(new Line2D.Double(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y));

                        pointStart = null;
                        pointEnd = null;
                    }
                });

                addMouseMotionListener(new MouseMotionAdapter() {
                    // mouseMoved ist hier überflüssig

                    public void mouseDragged(MouseEvent e) {
                        pointEnd = e.getPoint();

                        repaint();
                    }
                });
            }

            public void paintComponent(Graphics g) { // niemals paint verwenden, nur paintComponent
                super.paintComponent(g);

                Graphics2D g2d = (Graphics2D)g;
                g2d.setColor(Color.RED);

                lines.forEach(g2d::draw); // alle gespeicherten Linien lassen sich dank Graphics2D mit dieser einen Zeile malen
                if (pointStart != null) {
                    g2d.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
                }
            }
        };

        f.add(p);
        f.setVisible(true);
    }
}
Bei einem new Button würde dann die Linien Liste einfach geleert werden
 
Zuletzt bearbeitet:
Thema: 

JFrame, Linien zeichnen, MouseListener

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben