Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Informatik in der Schule » Graphische Objekte erzeugen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1] 2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Graphische Objekte erzeugen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Graphische Objekte erzeugen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Hallo,
Ich möchte mit bluej Java eine Simulation eines Pendels programmieren. Ich bin schon so weit, dass mir immer automatisch die Werte ausgerechnet werden. Jetzt fehlt mir nur noch die Graphische Umsetzung. Wie kann ich mir Linien und Kreise zeichnen lassen?


Meine Ideen:
Ich glaube ich brauche die Klasse Graphics aber entweder kriege ich dann immer eine null pointer exception oder ich brauche noch eine Variable.
22.09.2016 17:50 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Dann lass doch mal sehen, was du bisher schon hast.
null pointer klingt, als hättest du die Variable nicht initialisiert.

__________________
Syntax Highlighting fürs Board (Link)
22.09.2016 17:53 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.*;

public class GUI extends JFrame
{
private JFrame Fenster;
Graphics g;
public GUI()
{
Fenster = new JFrame("Fenster");
Fenster.setSize(1000,1000);
Fenster.setLocation(20,20);
Fenster.setVisible(true);
}

void Zeichnen()
{
g.drawLine(20,20,200,200);
}
}
22.09.2016 17:59 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

public class GUI extends JFrame - hier hast du schon mit this ein JFrame. Du brauchst im Konstruktor also kein neues erstellen.
Nimm die Methode paint(Graphics g), die wird vom System aufgerufen (auch, wenn das Fenster minimiert wurde, muss bei wieder öffnen neu gezeichnet werden).
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class GUI extends JFrame
{
	public static void main(String[] args) {
		GUI g = new GUI();
	}

	public GUI()
	{
		this.setTitle("Fenster");
		this.setSize(1000, 1000);
		this.setLocation(20, 20);
		this.setVisible(true);
	}

	public void paint(Graphics g) {
		g.setColor(Color.black);
		g.drawLine(0, 0, 100, 100);
	}
}


__________________
Syntax Highlighting fürs Board (Link)
22.09.2016 18:12 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,
danke für die Hilfe? Bei mir zeichnet es die Linie sofort kann die Linie auch erst gezeichnet werden, wenn ich die Methode aufrufe?
22.09.2016 18:54 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Der button zeichnet jetzt 2 Linien:
Die erste wird direkt gezeichnet. Diese wird wieder verschwinden, wenn neu gezeichnet werden muss.
Für die zweite wird eine Variable gesetzt, die angibt, dass gezeichnet werden soll und dann paint() aufgerufen. Die Linie bleibt erhalten.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GUI extends JFrame
{
	private boolean shallPaint = false;

	public static void main(String[] args) {
		GUI g = new GUI();
	}

	public GUI()
	{
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("Fenster");
		this.setSize(1000, 1000);
		this.setLocation(20, 20);
		this.setLayout(new FlowLayout());

		JButton button = new JButton("zeichnen");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				shallPaint = true;
				Graphics g = GUI.this.getGraphics();
				g.setColor(Color.red);
				//diese Linie wird wieder verschwinden
				g.drawLine(0, 100, 100, 0);
				GUI.this.paint(g);
			}
		});
		this.add(button);
		this.setVisible(true);
	}

	public void paint(Graphics g) {
		if (shallPaint) {
			g.setColor(Color.green);
			//die Linie bleibt auch beim Neuzeichnen erhalten
			g.drawLine(0, 0, 100, 100);
		}
	}
}


__________________
Syntax Highlighting fürs Board (Link)
23.09.2016 07:53 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,
was soll ich dann für die Variable g einsetzen? und geht das auch ohne Button ich habe es bereits so weit, dass es mir immer die x und die y Werte jede zehntel sekunde neu berechnet.
24.09.2016 18:36 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,
jetzt habe ich es geschafft, dass ich eine Methode Zeichnen hab, die auf Aufruf funktioniert. Wie kann ich die Methode in eine andere Klasse einbinden?
24.09.2016 18:52 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ja.
Mache die Methode public und rufe sie dann von der anderen Klasse aus auf.

__________________
Syntax Highlighting fürs Board (Link)
24.09.2016 18:54 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,
ich habe versucht die Methode von der anderen Klasse aufzurufen, aber immer wenn ich es ausführe haut es mir eine null pointer exception raus.
hier ist ein Auszug aus der anderen Klasse:

public class PENDEL
{
private double theta;
private double thetaPunkt;
private double thetaPunktPunkt;
private double m;
private double l;
private double g;
private double omega;
private double I;
private double tau;
private double x;
private double y;
private int X;
private int Y;
private int xAlt;
private int yAlt;
private GUI h;

public PENDEL()
{
// initialise instance variables
theta = 0.785;
thetaPunkt = 0;
thetaPunktPunkt = 0;
m = 0.05;
l = 0.10;
g = 9.81;
I = m*l*l;
omega = Math.sqrt(m*g*l/I);
tau = 0.0001;
x = Math.sin(theta)*l;
int X = (int)x;
xAlt = X;
y = Math.cos(theta)*l;
int Y = (int)y;
yAlt = Y;
GUI h = new GUI();
}

void Pendelschwingt()
{
h.Zeichnen();
while(theta != 0.00)
{
x = (int) xAlt;
y = (int) yAlt;
theta = thetaPunkt*tau+theta;
thetaPunkt = thetaPunktPunkt*tau+thetaPunkt;
thetaPunktPunkt = omega*omega*Math.sin(theta);
x = Math.sin(theta)*l;
System.out.println("x="+x);
y = Math.cos(theta)*l;
System.out.println("y="+y);
x = (int) X;
y = (int) Y;
}
24.09.2016 21:00 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich habe ganz vergessen die GUI Klasse auch noch mal herzuzeigen.
Hier ist die GUI:

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GUI extends JFrame
{
private boolean shallPaint = false;

public static void main(String[] args) {
GUI g = new GUI();
}

public GUI()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Fenster");
this.setSize(1000, 1000);
this.setLocation(20, 20);
this.setLayout(new FlowLayout());
this.setVisible(true);
}

public void Zeichnen()
{
shallPaint = true;
Graphics g = GUI.this.getGraphics();
GUI.this.paint(g);
}

public void paint(Graphics g)
{
if (shallPaint)
{
g.setColor(Color.black);
g.drawLine(500, 500, 600, 600);
g.fillOval(495, 495, 10, 10);
g.setColor(Color.blue);
g.fillOval(595, 595, 10, 10);
g.drawLine(0,0,0,0);
}
}
}
24.09.2016 21:04 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

So in etwa?
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;

public class PENDEL
{
	private double theta;
	private double thetaPunkt;
	private double thetaPunktPunkt;
	private double m;
	private double l;
	private double g;
	private double omega;
	private double I;
	private double tau;
	private double x;
	private double y;
	private int xAlt;
	private int yAlt;
	private GUI h;

	public static void main(String[] args) {
		new PENDEL();
	}

	public PENDEL()
	{
		// initialize instance variables
		theta = 0.785;
		thetaPunkt = 0;
		thetaPunktPunkt = 0;
		m = 0.05;
		l = 0.10;
		g = 9.81;
		I = m * l * l;
		omega = Math.sqrt(m * g * l / I);
		tau = 0.0001;
		x = Math.sin(theta) * l;
		int X = (int) x;
		xAlt = X;
		y = Math.cos(theta) * l;
		int Y = (int) y;
		yAlt = Y;
		h = new GUI();

		final Timer t = new Timer(1, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				PENDEL.this.pendelSchwingt();
			}
		});
		t.start();
	}

	public double getX() {
		return x;
	}

	public double getY() {
		return y;
	}

	void pendelSchwingt()
	{
		h.zeichnen(this);
		x = (int) xAlt;
		y = (int) yAlt;
		theta = thetaPunkt * tau + theta;
		thetaPunkt = thetaPunktPunkt * tau + thetaPunkt;
		thetaPunktPunkt = omega * omega * Math.sin(theta);
		x = Math.sin(theta) * l;
		System.out.println("x=" + x);
		y = Math.cos(theta) * l;
		System.out.println("y=" + y);
	}
}


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JFrame;

public class GUI extends JFrame
{
	public GUI()
	{
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("Fenster");
		this.setSize(1000, 1000);
		this.setLocation(20, 20);
		this.setLayout(new FlowLayout());
		this.setVisible(true);
	}

	private PENDEL pendel;

	public void zeichnen(PENDEL pendel)
	{
		this.pendel = pendel;
		Graphics g = GUI.this.getGraphics();
		GUI.this.paint(g);
	}

	public void paint(Graphics g)
	{
		int x0 = 200;
		int y0 = 200;
		int x1 = (int) (pendel.getX() * 500 + x0);
		int y1 = (int) (-pendel.getY() * 500 + y0);
		g.setColor(Color.white);
		g.fillRect(-1, -1, 1000, 1000);
		g.setColor(Color.black);
		g.drawLine(x0, y0, x1, y1);
		g.fillOval(x0 - 5, y0 - 5, 10, 10);
		g.setColor(Color.blue);
		g.fillOval(x1 - 5, y1 - 5, 10, 10);
	}
}


__________________
Syntax Highlighting fürs Board (Link)
25.09.2016 07:24 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo;
warum muss ich wenn ich x1 haben mag x mal 500 nehmen und dann noch plus x0?
int x1 = (int) (pendel.getX() * 500 + x0);
25.09.2016 18:00 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

x0: ich wollte das Pendel irgendwie mittig haben und nicht am Rand, dass die Hälfte (negatives x) abgeschnitten ist.
Faktor 500: dein Pendel ist sehr kurz. Das würde sich vielleicht ein Pixel hin und herbewegen, wenn ich es nicht hochskalieren würde.

__________________
Syntax Highlighting fürs Board (Link)
25.09.2016 18:06 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marina17
Grünschnabel


Dabei seit: 22.09.2016
Beiträge: 9

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,
was macht bei der GUI der Timer? und wozu brauche ich ihn?
28.09.2016 08:45 Marina17 ist offline E-Mail an Marina17 senden Beiträge von Marina17 suchen Nehmen Sie Marina17 in Ihre Freundesliste auf
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Informatik in der Schule » Graphische Objekte erzeugen