Kreis-Mal-Programm

Edgeworth

Mitglied
Hallo, ich bin quasi ein Neuling beim Java Programmieren und bräuchte Hilfe beim Schreiben von einem Programm.

Das Programm besteht aus ein paar Textfeldern, in die man Werte eingeben kann und das Programm soll dann anhand dieser Werte einen Kreis zeichnen.

Ich habe allerdings Schwierigkeiten dabei, die actionPerformed Methode korrekt zu schreiben, bzw. weiss nicht, wie ich es hinkriege, das Ausführen einer zweiten Methode in einer Methode zu formulieren. Theoretisch sollte das doch gehen, oder?
Das ganze sieht bis jetzt so aus:

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class Circle extends JFrame implements ActionListener {
	JLabel xLabel = new JLabel("X-Position: ");
	JTextField xField = new JTextField("0", 3);
	JLabel yLabel = new JLabel("Y-Position: ");
	JTextField yField = new JTextField("0", 3);
	JLabel rLabel = new JLabel("Radius: ");
	JTextField rField = new JTextField("0", 3);
	JButton draw = new JButton("Draw Circle");
	JPanel pane = new JPanel();
	float x;
	float y;
	float r;
	
	public Circle() {
		super("Circle Drawer");
		setSize(400, 250);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pane.setLayout(null);
		xLabel.setBounds(new Rectangle(10, 10, 100, 20));
		xField.setBounds(new Rectangle(90, 10, 40, 20));
		yLabel.setBounds(new Rectangle(10, 40, 100, 20));
		yField.setBounds(new Rectangle(90, 40, 40, 20));
		rLabel.setBounds(new Rectangle(10, 70, 100, 20));
		rField.setBounds(new Rectangle(90, 70, 40, 20));
		draw.setBounds(new Rectangle(10, 100, 120, 20));
		CirclePane crcl = new CirclePane();
		crcl.setBounds(new Rectangle(150, 10, 220, 180));
		pane.add(xLabel);
		pane.add(xField);
		pane.add(yLabel);
		pane.add(yField);
		pane.add(rLabel);
		pane.add(rField);
		pane.add(draw);
		pane.add(crcl);
		add(pane);
		setVisible(true);
	}
	
	public static void main(String[] arguments) {
		new Circle();
	}
	
	public void actionPerformed(ActionEvent event) {
		float x = Float.parseFloat(xField.getText());
		float y = Float.parseFloat(yField.getText());
		float r = Float.parseFloat(rField.getText());
		// paintComponents(?);
	}
}

class CirclePane extends JPanel {
	float x;
	float y;
	float r;
	
	public void paintComponents(Graphics comp) {
		Graphics2D comp2D = (Graphics2D)comp;
		comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		Ellipse2D.Float circle = new Ellipse2D.Float(x, y, r, r);
		comp2D.draw(circle);
	}
}

Der Fehler liegt in Zeile 53.
Ich weiss nicht, wie ich es zum Ausdruck bringen soll, dass das Programm, nachdem es die Werte aus den TextFeldern eingelesen hat, die paintComponents()-Methode durchführt, die weiter unten definiert ist.
Ich hab schon einiges ausprobiert, aber es gelingt mir nicht, das ganze korrekt zu formulieren.

Kann mir vielleicht jemand dabei helfen?
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Und was willst du mit den ganzen floats? Irgendwie müssen x/y/z ja da hin kommen, wo sie zum Zeichnen benötigt werden...
Java:
public class Circle extends JFrame implements ActionListener {

// WEG
//    float x;
//    float y;
//    float r;

// HIN:
    CirclePane crcl;
    
    public Circle() {
...
ANDERS:
//        CirclePane crcl = new CirclePane();
        this.crcl = new CirclePane();
...
    }
    
    public static void main(String[] arguments) {
        new Circle();
    }
    
    public void actionPerformed(ActionEvent event) {
// ANDERS:
        crcl.x = Float.parseFloat(xField.getText());
        crcl.y = Float.parseFloat(yField.getText());
        crcl.r = Float.parseFloat(rField.getText());
// DANN REICHT HIER AUCH EIN
        repaint();
    }
}
 
G

Gast2

Gast
In CirclePane dann auch noch die
Code:
paintComponent
(ohne s) überschreiben.
 

Edgeworth

Mitglied
Hm, wenn ich darf, würd ich gerne noch eine weitere Frage zu dem Programm stellen.

Ich hab versucht, das ganze noch etwas zu verfeinern.
In einem letzten Schritt wollte ich gerne noch eine CheckBox einfügen, sodass das Programm, wenn die Box ausgewählt ist, den Kreis ausfüllt anstatt nur die Linie zu zeichnen.

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class Circle extends JFrame implements ActionListener, ItemListener {
	JLabel xLabel = new JLabel("X-Position: ");
	JTextField xField = new JTextField("0", 3);
	JLabel yLabel = new JLabel("Y-Position: ");
	JTextField yField = new JTextField("0", 3);
	JLabel rLabel = new JLabel("Radius: ");
	JTextField rField = new JTextField("0", 3);
	JLabel fill = new JLabel("Fill Circle?");
	JCheckBox fillBox = new JCheckBox();
	JLabel error = new JLabel("Error!");
	JLabel oob = new JLabel("Out of Bounds!");
	JButton draw = new JButton("Draw Circle");
	JPanel pane = new JPanel();
	CirclePane crcl;
	
	public Circle() {
		super("Circle Drawer");
		setSize(400, 250);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pane.setLayout(null);
		xLabel.setBounds(new Rectangle(10, 10, 100, 20));
		xField.setBounds(new Rectangle(90, 10, 40, 20));
		yLabel.setBounds(new Rectangle(10, 40, 100, 20));
		yField.setBounds(new Rectangle(90, 40, 40, 20));
		rLabel.setBounds(new Rectangle(10, 70, 100, 20));
		rField.setBounds(new Rectangle(90, 70, 40, 20));
		fill.setBounds(new Rectangle(10, 105, 70, 20));
		fillBox.setBounds(new Rectangle(100, 105, 40, 20));
		draw.setBounds(new Rectangle(10, 140, 120, 20));
		error.setBounds(new Rectangle(60, 170, 120, 20));
		oob.setBounds(new Rectangle(30, 170, 120, 20));
		error.setForeground(Color.red);
		oob.setForeground(Color.red);
		draw.addActionListener(this);
		fillBox.addItemListener(this);
		this.crcl = new CirclePane();
		crcl.setBounds(new Rectangle(150, 10, 220, 180));
		pane.add(xLabel);
		pane.add(xField);
		pane.add(yLabel);
		pane.add(yField);
		pane.add(rLabel);
		pane.add(rField);
		pane.add(fill);
		pane.add(fillBox);
		pane.add(draw);
		pane.add(error);
		pane.add(oob);
		pane.add(crcl);
		add(pane);
		setVisible(true);
		error.setVisible(false);
		oob.setVisible(false);
	}
	
	public static void main(String[] arguments) {
		new Circle();
	}
	
	public void actionPerformed(ActionEvent event) {
		try { 
			float w = 0;
			float h = 0;
			float pw = 0;
			float ph = 0;
			crcl.x = Float.parseFloat(xField.getText());
			crcl.y = Float.parseFloat(yField.getText());
			crcl.r = Float.parseFloat(rField.getText());
			w = 2 * crcl.r + crcl.x;
			h = 2 * crcl.r + crcl.y;
			pw = crcl.getSize().width;
			ph = crcl.getSize().height;
			if (w < pw && h < ph) {
				error.setVisible(false);
				oob.setVisible(false);
				repaint();
			} else if (w >= pw || h >= ph) {
				xField.setText("0");
				yField.setText("0");
				rField.setText("0");
				crcl.x = 0;
				crcl.y = 0;
				crcl.r = 0;
				oob.setVisible(true);
				repaint();
			}
		} catch (NumberFormatException nfe) {
			xField.setText("0");
			yField.setText("0");
			rField.setText("0");
			crcl.x = 0;
			crcl.y = 0;
			crcl.r = 0;
			error.setVisible(true);
			repaint();
		}
	}
	
	public void itemStateChanged(ItemEvent evt) {
		// ?
	}
}


class CirclePane extends JPanel {
	float x;
	float y;
	float r;
		
	public void paintComponent(Graphics comp) {
		Graphics2D comp2D = (Graphics2D)comp;
		comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		Ellipse2D.Float circle = new Ellipse2D.Float(x, y, 2*r, 2*r);
		if (Circle.fillBox.isSelected() == true) {
			comp2D.draw(circle);
		} else if (Circle.fillBox.isSelected() == true) {
			comp2D.fill(circle);
	}
}
}

Die letzten paar Zeilen sind leider nicht richtig.
Wahrscheinlich handelt es sich um einen ganz dummen Fehler, aber ich komme nicht drauf.
Ich bin mir nicht wirklich sicher, wo ich den if-Befehl definieren soll.
Eigentlich müsste ja noch was in die itemStateChanged Methode hinein, allerdings macht es logisch gesehen für mich mehr Sinn, in der paintComponent Methode zu definieren, wann der Kreis ausgefüllt werden soll und wann nicht.
 

GUI-Programmer

Top Contributor
Wenn du die Abfrage schon unbedingt direkt in der paintComponent machen möchtest, dann brauchst du fillbox.addItemListener nicht. Ach ja, dein Fehler:
Code:
Circle.fillBox.isSelected()
sollte
Code:
fillBox.isSelected()
heißen, da fillbox ja schließlich nicht static ist.

Mein Vorschlag wäre allerdings, den ItemListener zu behalten und eine Variable boolean fill erstellen, die sich dann in itemStateChanged ändert und diese in der paintComponent abzufragen.
 

Edgeworth

Mitglied
Also wenn ich die beiden Zeilen, wie du gesagt hast, in
Code:
fillBox.isSelected()
ändere, ändert sich dadurch leider nichts.

Zu dem Vorschlag das ganze im ItemListener zu behalten:
Wie genau müsste der Code dort aussehen?
Das Thema CheckBoxes wird in meinem Java Lehrbuch leider ein wenig unzureichend behandelt, deswegen bin ich mir da etwas unsicher. :oops:
 

Marco13

Top Contributor
Die Struktur ist insgesamt ziemlich fragwürdig (man kann immer nur EINEN Kreis zeichnen, die vielen Fields die nicht gebraucht werden, der Konstruktor ist unübersichtlich und ein null-Layout nicht gut) aber es sind die ersten Schritte, von daher... naja.

Das
Circle.fillBox.isSelected()
funktioniert so natürlich nicht, und die "Richtung" ist... ungünstig: Es sollte nicht bei jedem Neuzeichnen die Checkbox abgefragt werden. Stattdessen sollte es im CirclePanel ein
boolean filled = false;
geben, das (genauso wie jetzt x,y,z) von außen gesetzt wird. In der paintComponent fragt man das dann ab, und macht entweder drawOval oder fillOval.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
L 2D-Grafik Linie von Kreis zu Kreis AWT, Swing, JavaFX & SWT 3
S Kreis vergrößern/verkleinern mit Buttons AWT, Swing, JavaFX & SWT 1
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
L 2D-Grafik Dreieck in einem Kreis??? AWT, Swing, JavaFX & SWT 1
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
D Swing Manuellen Kreis zeichen AWT, Swing, JavaFX & SWT 22
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13
J Grafik (Kreis) schneller bewegen? AWT, Swing, JavaFX & SWT 6
S Kreis in Kreis AWT, Swing, JavaFX & SWT 5
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
M 2D-Grafik "Unvollständiger" Kreis(kontur) AWT, Swing, JavaFX & SWT 8
T Einen Kreis anzeigen AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Text in einem Kreis zentrieren AWT, Swing, JavaFX & SWT 3
Semox 2D-Grafik Radialer Verlauf in einem Kreis AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
P Swing FocusTraversalPolicy dreht sich im Kreis AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
Semox Swing Kreis löschen durch Mausklick in der Nähe AWT, Swing, JavaFX & SWT 2
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
K Wenn Mauszeiger in der Nähe vom Kreis, soll Kreis an eine andere Stelle springen AWT, Swing, JavaFX & SWT 8
Spin Hilfe - Erklärungsbedarf für Kreis AWT, Swing, JavaFX & SWT 5
H Punkte im Kreis AWT, Swing, JavaFX & SWT 3
G kreis malen -> welche funktion? AWT, Swing, JavaFX & SWT 3
G Farbe ändern bei Klick auf einen Kreis AWT, Swing, JavaFX & SWT 5
M Kreis mit gedrückter Maus bewegen AWT, Swing, JavaFX & SWT 20
U Farbe von Kreis AWT, Swing, JavaFX & SWT 3
G Kreis zeichnen und mit Maus ziehen AWT, Swing, JavaFX & SWT 3
S Kreis als JFrame AWT, Swing, JavaFX & SWT 9
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
T Kreis ActionListener AWT, Swing, JavaFX & SWT 5
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 31
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
G CAD Programm AWT, Swing, JavaFX & SWT 4
thor_norsk E - Mail Programm AWT, Swing, JavaFX & SWT 2
_user_q Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
J Programm findet Resource nicht. AWT, Swing, JavaFX & SWT 6
N Programm Läuft nicht auf anderen Pcs AWT, Swing, JavaFX & SWT 9
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
S Lustiges programm schnell coden? AWT, Swing, JavaFX & SWT 2
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
M DragAndDrop - aus Browser ins Programm AWT, Swing, JavaFX & SWT 6
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
L JavaFX IntelliJ Standalone Programm exportieren AWT, Swing, JavaFX & SWT 9
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
M AWT Programm in den Tray minimieren AWT, Swing, JavaFX & SWT 2
steven789hjk543 Swing Weiß jemand, warum dieses Programm nicht funktioniert? AWT, Swing, JavaFX & SWT 7
A Java Programm gestalten AWT, Swing, JavaFX & SWT 4
P Swing Warum startet das Programm nicht? AWT, Swing, JavaFX & SWT 3
J JavaFX Kamera im Programm öffnen AWT, Swing, JavaFX & SWT 6
H Hintergrundbild in einem Programm AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower progressBar in ein bestehendes Programm einbauen AWT, Swing, JavaFX & SWT 3
J Verbesserungsvorschläge?! Kleines AWT Programm AWT, Swing, JavaFX & SWT 4
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
Arif Swing Programm friert ein... AWT, Swing, JavaFX & SWT 2
apple_pie1998 Programm gibt plötzlich exceptions aus. AWT, Swing, JavaFX & SWT 4
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
X JMenu Menu-Bar ausrichtung ändern im Programm AWT, Swing, JavaFX & SWT 0
T Swing Programm hängt sich auf! AWT, Swing, JavaFX & SWT 23
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
P Programm durch Dateiaufruf starten und Datei öffnen AWT, Swing, JavaFX & SWT 2
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
G Programm GUI erstellen AWT, Swing, JavaFX & SWT 5
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
T Programm im METRO Design? AWT, Swing, JavaFX & SWT 1
J Programm hängt sich bei Log In auf AWT, Swing, JavaFX & SWT 1
C Programm mit Passwort schließen AWT, Swing, JavaFX & SWT 5
D Robot Programm mit Escape abbrechen (aus Eclipse heraus) AWT, Swing, JavaFX & SWT 2
N Programm läuft perfekt in Eclipse aber nicht in .JAR AWT, Swing, JavaFX & SWT 3
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
J Programm im GUI ausführen AWT, Swing, JavaFX & SWT 4
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
S Event Handling konsole Programm mit Tastendruck beenden AWT, Swing, JavaFX & SWT 5
G JTextArea on the fly aus anderem Programm befüllen AWT, Swing, JavaFX & SWT 4
K Swing Konsolen Programm in GUI - Suche Hilfe bei Konsolenausgabe AWT, Swing, JavaFX & SWT 2
W Windows Fenster in einem Programm AWT, Swing, JavaFX & SWT 2
F Mal Programm AWT, Swing, JavaFX & SWT 13
C In Hauptfenster Programm-Klassen implementieren AWT, Swing, JavaFX & SWT 9
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
C Swing Wie kann ich im Programm das Menü schließen AWT, Swing, JavaFX & SWT 2
J SWING - Programm ohne Eclipse etc. starten AWT, Swing, JavaFX & SWT 7
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
M Programm in Jframe "einbinden" AWT, Swing, JavaFX & SWT 7
S Programm auf aktuellen Stand bringen AWT, Swing, JavaFX & SWT 2
Spin Tool: Popup -Programm AWT, Swing, JavaFX & SWT 3
GUI-Programmer Swing JWindow - Programm wird ohne Grund beendet AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben