Rechteck zeichnen mit Canvas

JAVAsk

Mitglied
Ich habe ein kleines Programm geschrieben, welches durch Eingabe der x- & y-Koordinate sowie der Breite und Höhe, ein entsprechendes Rechteck zeichnet.
Dazu die 2 Klassen:

Java:
import javax.swing.*;
import java.awt.*;
 
public class MyGUI {
public static void main(String[] args){
	JFrame myFrame = new JFrame("My GUI");
	JPanel keyDisplayPanel = new JPanel();
	MyCanvas myCanvas = new MyCanvas();
  
    myFrame.setLayout(new BorderLayout(20,20));
    keyDisplayPanel.setLayout(new BorderLayout(20,20));
     
    keyDisplayPanel.add(myCanvas, BorderLayout.CENTER);
    myFrame.add(keyDisplayPanel, BorderLayout.CENTER);
  
	myFrame.setSize(500,500);
    myFrame.setVisible(true);
  }
 
}

Java:
import java.awt.*;
 
public class MyCanvas extends Canvas {
  public void paint(final Graphics g){
   
	System.out.println("Geben Sie bitte die x-Koordinate ein:");
    int x= Integer.parseInt(System.console().readLine());
	
	System.out.println("Geben Sie bitte die y-Koordinate ein:");
    int y= Integer.parseInt(System.console().readLine());
	
	System.out.println("Geben Sie bitte die Breite ein:");
    int width= Integer.parseInt(System.console().readLine());
	
	System.out.println("Geben Sie bitte die Höhe ein:");
    int height= Integer.parseInt(System.console().readLine());
	
	if(x>=0 && y>=0 && width>=0 && height>=0){	
	super.paint(g);
	g.drawRect(x, y, width, height);
	}
	else{ 
	System.out.println("Bitte keine negativen Werte eingeben!");
	}
	
  }
}

Das Programm zeichnet zwar das Rechteck, aber er fragt mich jeweils 2-Mal nach den Werten(s. oben). D.h., er zeichnet das kurz und löscht es gleichzeitig, beim zweiten Zeichnen bleibt es jedoch da. Was muss ich jetzt ändern?

Vielen Dank!???:L
 
Zuletzt bearbeitet von einem Moderator:

qwert

Aktives Mitglied
Probier's mal damit, einen Konstruktor in der Klasse "MyCanvas" zu erstellen, und die Ausgaben und Einlesevorgänge dahin zu verschieben.
 

Harry Kane

Top Contributor
"Funktioniert nicht" ist keine Fehlermeldung, schon gar nicht ohne Code. Du kannst übrigens nicht bestimmen, wie oft die paint-Methode aufgerufen wird. Unter Umständen kann dies sehr häufig der Fall sein. Aus diesem grund sollte man dort auch nur zeichnen, und keinesfalls Benutzereingaben anfordern.
 

Flown

Administrator
Mitarbeiter
Dein Ansatz muss anders laufen. Du fügst von außen ein neues Rechteck hinzu und lässt die pane repainten.

Java:
import java.awt.Canvas;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import javax.swing.JFrame;

public class Test {
  public static void main(String... args) {
    new Test();
  }
  
  public Test() {
    JFrame frame = new JFrame("MyCanvas");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationByPlatform(true);
    MyCanvas pane = new MyCanvas();
    frame.add(pane);
    frame.setSize(800, 600);
    frame.setVisible(true);
    
    try (Scanner scanner = new Scanner(System.in)) {
      while (true) {
        int x, y, width, height;
        System.out.print("x: ");
        x = scanner.nextInt();
        System.out.print("y: ");
        y = scanner.nextInt();
        System.out.print("width: ");
        width = scanner.nextInt();
        System.out.print("height: ");
        height = scanner.nextInt();
        pane.addRectangle(new MyRectangle(x, y, width, height));
      }
    }
  }
  
  class MyRectangle {
    private int x, y, width, height;
    
    public MyRectangle(int x, int y, int width, int height) {
      this.x = x;
      this.y = y;
      this.width = width;
      this.height = height;
    }
    
    public int getX() {
      return x;
    }
    
    public void setX(int x) {
      this.x = x;
    }
    
    public int getY() {
      return y;
    }
    
    public void setY(int y) {
      this.y = y;
    }
    
    public int getWidth() {
      return width;
    }
    
    public void setWidth(int width) {
      this.width = width;
    }
    
    public int getHeight() {
      return height;
    }
    
    public void setHeight(int height) {
      this.height = height;
    }
  }
  
  class MyCanvas extends Canvas {
    private static final long serialVersionUID = 1L;
    
    List<MyRectangle> rectangles;
    
    public MyCanvas() {
      rectangles = new ArrayList<>();
    }
    
    public void addRectangle(MyRectangle rect) {
      rectangles.add(rect);
      repaint();
    }
    
    @Override
    public void paint(Graphics g) {
      super.paint(g);
      for (MyRectangle rect : rectangles) {
        g.drawRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
      }
    }
  }
}
 

JAVAsk

Mitglied
Ok..Das Meiste habe ich verstanden.
Könntest du mir bitte die Zeilen erklären, bei denen ich "???" als Kommentar geschrieben habe und überprüfen, ob die restlichen Kommentare, die ich geschrieben habe, stimmen.

Java:
    import java.util.Scanner;
    import javax.swing.JFrame;
     
public class Test{
    public static void main(String... args) {
    new Test();
    }
     
    public Test() {
    JFrame frame = new JFrame("Zeichne dein ");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // sorgt dafür, dass beim Schließen des Fensters keine Exceptions ausgegeben werden
    frame.setLocationByPlatform(true); // ???
    MeinCanvas pane = new MeinCanvas();
    frame.add(pane);
    frame.setSize(700, 700);
    frame.setVisible(true);
     
    try (Scanner scanner = new Scanner(System.in)) {
    while (true) {
    int x, y, width, height;
    System.out.print("x-Koordinate: ");
    x = scanner.nextInt(); // macht das Selbe wie --> x = Integer.parseInt(System.console().readLine());
    System.out.print("y-Koordinate: ");
    y = scanner.nextInt();
    System.out.print("Breite: ");
    width = scanner.nextInt();
    System.out.print("Höhe: ");
    height = scanner.nextInt();
    pane.addRectangle(new MyRectangle(x, y, width, height));
    }
    }
    }
    
    }


Java:
	import java.awt.Canvas;
    import java.awt.Graphics;
    import java.util.ArrayList;
    import java.util.List;

class MeinCanvas extends Canvas {
    private static final long serialVersionUID = 1L; // ???
     
    List<MyRectangle> rectangles;
     
    public MeinCanvas() {
    rectangles = new ArrayList<>();
    }
     
    public void addRectangle(MyRectangle rect) { // Die Methode fügt rekursiv weitere Rechtecke hinzu
    rectangles.add(rect);
    repaint();
    }
     
    @Override // ???
    public void paint(Graphics g) {
    super.paint(g);
    for (MyRectangle rect : rectangles) { // ??? (Bedingung)
    g.drawRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
    }
    }
    
    }


Java:
class MyRectangle{
    private int x, y, width, height;
     
    public MyRectangle(int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    }
     
    public int getX() {
    return x;
    }
     
    public void setX(int x) {
    this.x = x;
    }
     
    public int getY() {
    return y;
    }
     
    public void setY(int y) {
    this.y = y;
    }
     
    public int getWidth() {
    return width;
    }
     
    public void setWidth(int width) {
    this.width = width;
    }
     
    public int getHeight() {
    return height;
    }
     
    public void setHeight(int height) {
    this.height = height;
    }
    }

Vielen Dank! :)
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Achja falls du Fragen zu den einzelnen Sachen hast, dann sieh dir bitte mal die Dokumentation der Java API an und Google ist dein Freund.

Java:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Beendet das Javaprogramm beim drücken auf das x des Fensters
frame.setLocationByPlatform(true); //Das Betriebssystem setzt dir das Fenster hin wo es das haben will (sagt eigentlich schon der Name!)
x = scanner.nextInt(); // macht das Selbe wie --> x = Integer.parseInt(System.console().readLine()); -- nein (aber in diesem Kontext ja)
private static final long serialVersionUID = 1L; //Benötigt man zum De-/Serialisieren -> lies nach wenn du näheres wissen willst!
public void addRectangle(MyRectangle rect) { ... }// Die Methode fügt rekursiv weitere Rechtecke hinzu -> Nein! sie fügt nur ein rect in das private Listenfeld der Instanz hinzu
@Override // Zeigt an das eine Methode der Superklasse überschrieben wird (ist optional aber IDEs fügen es zur besseren Lesbarkeit hinzu)
for (MyRectangle rect : rectangles) { //Das nennt sich eine for-each Schleife und kannst genügend im Internet dazu lesen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Rechteck zeichnen Java Basics - Anfänger-Themen 2
I Rechteck Zeichnen Java Basics - Anfänger-Themen 9
M Farbiges Rechteck zeichnen Java Basics - Anfänger-Themen 2
B Rechteck aus Sternen Zeichnen Java Basics - Anfänger-Themen 8
B Swing Rechteck zeichnen Java Basics - Anfänger-Themen 14
G dicke linie zeichnen bzw schräges rechteck füllen Java Basics - Anfänger-Themen 2
laxla123 Rechteck programmieren Java Basics - Anfänger-Themen 4
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
L Wie vergrößere ich ein Rechteck in alle Richtungen um eins und bekomme dessen Rand? Java Basics - Anfänger-Themen 2
S Erste Schritte Java - Applet - Rechteck ständig versetzen Java Basics - Anfänger-Themen 14
GRAZZ0R MouseListener - Rechteck Bewegen Java Basics - Anfänger-Themen 1
S Erste Schritte Ein Rechteck aus Sternchen mit Wiederholungsanweisung erstellen Java Basics - Anfänger-Themen 2
T Rechteck Programmieren Java Basics - Anfänger-Themen 4
F Klasse Rechteck definieren Java Basics - Anfänger-Themen 21
M Erste Schritte Gefülltes Rechteck programmieren Java Basics - Anfänger-Themen 1
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
S Ein Rechteck soll an einer Seite gespiegelt werden. Java Basics - Anfänger-Themen 5
G Methoden Nicht überlappte teile eines Rechteck's Java Basics - Anfänger-Themen 9
T Rechteck Koolision Java Basics - Anfänger-Themen 4
O Rechteck Java Basics - Anfänger-Themen 10
X Rechteck Java Basics - Anfänger-Themen 2
F Rechteck/Quadrat getroffen? Java Basics - Anfänger-Themen 2
K Rechteck/Quadrat Java Basics - Anfänger-Themen 5
P Rechteck Zufallsverschiebung mit Abprallen Java Basics - Anfänger-Themen 12
M Umfang von Rechteck oder Kreis anhand der Parameter Java Basics - Anfänger-Themen 2
J Rechteck Java Basics - Anfänger-Themen 8
G Rechteck zeichen Java Basics - Anfänger-Themen 4
J itext - Rechteck in PdfCell Java Basics - Anfänger-Themen 2
E klasse für ein Rechteck schreiben Java Basics - Anfänger-Themen 25
K Rechteck mit einem Loch in dem Mitte Java Basics - Anfänger-Themen 11
H Rechteck ziehen bei einer Application Java Basics - Anfänger-Themen 2
Dilandau rechteck des applet inhalts als gif-datei speichern? Java Basics - Anfänger-Themen 2
R mit MouseDragged Rechteck verschieben. Java Basics - Anfänger-Themen 2
G Linie innerhalb Rechteck Java Basics - Anfänger-Themen 2
W Problem mit einem Programm Rechteck Fläche, Umfang Java Basics - Anfänger-Themen 6
J SWING UI Designer und zeichnen Java Basics - Anfänger-Themen 4
luggas89 Mit Jframe live zeichnen Java Basics - Anfänger-Themen 4
K 3D Fläche Zeichnen Java Basics - Anfänger-Themen 2
J Bild auf Hintergrundbild zeichnen Java Basics - Anfänger-Themen 5
R Iterativ zeichnen Java Basics - Anfänger-Themen 1
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
KogoroMori21 Mit einer Schleife eine Treppe zeichnen Java Basics - Anfänger-Themen 29
V Speicherzustand zeichnen Java Basics - Anfänger-Themen 0
O Klappt nicht: Ein Panel neu zeichnen Java Basics - Anfänger-Themen 3
CptK Interface Bilder mit Graphics g zeichnen Java Basics - Anfänger-Themen 7
B Java JFrame zeichnen Java Basics - Anfänger-Themen 4
Mosquera f(x)=x² zeichnen Java Basics - Anfänger-Themen 5
J Graphen in Java zeichnen Java Basics - Anfänger-Themen 11
L Anfängerin möchte Linie zeichnen Java Basics - Anfänger-Themen 8
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
S Zeichnen mit Wiederholungen Java Basics - Anfänger-Themen 12
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
P Einen String mittig zeichnen? Java Basics - Anfänger-Themen 1
T Koordinatensystem zeichnen - Variablen merken? Quadratische Funktion zeichnen? Java Basics - Anfänger-Themen 5
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
W Wie kann ich in Java eine Kurve aus Punkten zeichnen? Java Basics - Anfänger-Themen 25
snipesss Linie zeichnen ohne extra Klasse? Java Basics - Anfänger-Themen 3
C Umrisse von Bilddateien mithilfe Polygonen zeichnen Java Basics - Anfänger-Themen 5
G Aus einem Code ein Sequenzdiagramm zeichnen? Java Basics - Anfänger-Themen 1
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
B Java Graphen zeichnen - Brauche Hilfe Java Basics - Anfänger-Themen 9
C Schleifenaufgabe - Molekül zeichnen Java Basics - Anfänger-Themen 6
K Ungenauigkeit beim Zeichnen von Funktionen Java Basics - Anfänger-Themen 6
H Linie zeichnen... Java Basics - Anfänger-Themen 16
N Treppe zeichnen Java Basics - Anfänger-Themen 1
M Quadrat zeichnen einfach bitte! Java Basics - Anfänger-Themen 2
P Shape Zeichnen klappt nicht - einlesen der Breite/Höhe schon Java Basics - Anfänger-Themen 1
M in Java zeichnen Java Basics - Anfänger-Themen 2
J JLabel Icon neu zeichnen Java Basics - Anfänger-Themen 2
D Zeichnen, Schleifen Java Basics - Anfänger-Themen 7
S Zeichnen , Schleifen Java Basics - Anfänger-Themen 4
S Ein Graphics Obejct mehrmals mit denselben Eigenschaften zeichnen lassen?!?!? Java Basics - Anfänger-Themen 4
S Wo beginnt ein Draw String zu zeichnen. Java Basics - Anfänger-Themen 4
S Paint Anwendung: Freihandlinien zeichnen Java Basics - Anfänger-Themen 4
llabusch Layout neu zeichnen lassen Java Basics - Anfänger-Themen 2
A Histogramm zeichnen Java Basics - Anfänger-Themen 2
S Punkt in Java zeichnen Java Basics - Anfänger-Themen 14
E Dreieck zeichnen Java Basics - Anfänger-Themen 3
gamebreiti Methoden JPanel nach clearAll() und add neu zeichnen Java Basics - Anfänger-Themen 1
T Baum mit Turtle zeichnen Java Basics - Anfänger-Themen 2
C Hilfe beim Zeichnen Java Basics - Anfänger-Themen 8
D Haus zeichnen Java Basics - Anfänger-Themen 4
K Methoden Objekt auf JFrame zeichnen Java Basics - Anfänger-Themen 16
H 27 Kreise Zeichnen Java Applet Java Basics - Anfänger-Themen 2
S Problem mit "Zeichnen auf Kommando" Java Basics - Anfänger-Themen 2
M Double Punkte Zeichnen Java Basics - Anfänger-Themen 7
S Funktionen zeichnen Java Basics - Anfänger-Themen 2
2 Bild auf JApplet zeichnen Java Basics - Anfänger-Themen 18
R 2D Grafik zeichnen Java Basics - Anfänger-Themen 4
F Line zeichnen und Werte ändern Java Basics - Anfänger-Themen 6
B Grafik zeichnen Java Basics - Anfänger-Themen 25
B Erste Schritte Weihnachtsbaum zeichnen Java Basics - Anfänger-Themen 6
N Per Button Kreis zeichnen Java Basics - Anfänger-Themen 8
T mehrere Punkte zeichnen ohne löschung Java Basics - Anfänger-Themen 4
J Für 3 Sekunden etwas bestimmtes zeichnen Java Basics - Anfänger-Themen 8
C Kreis nach Mausklick zeichnen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben