G
Gelöschtes Mitglied 52572
Gast
Servus,
ich hoffe mal, dass ich nichts übersehen habe und so eine Frage jetzt nicht zum zweiten Mal gestellt wird. Google hilft mir auch nicht wirklich weiter, da ich fast nur das Zeichnen einfacher Punkte finde etc.. (Evtl bin ich auch zu blöd zum Suchen...)
Mittlerweile habe ich leider auch gar nicht mehr richtig den Kopf dafür, bin schon den ganzen Tag am ausprobieren. Habe erst mit Java und Java-Swing angefangen und noch nicht so viel Ahnung.
Wir sollen ein Tetraeder erstellen, welches wir mit einem Controller mithilfe von Matrizen steuern sollen. (Verschiebung etc)
Mein Problem jetzt ist jedoch, dass ich keinen Plan habe, wie ich die ganzen Punkte gleichzeitig erstellen und mit dem Controller steuern soll.
Also den Controller und einen Punkt bekomme ich ja noch hin, aber wie das dann mit mehreren Punkten aussieht, da komm ich nicht drauf.
Ich habe gedacht, dass ich ein Graphics-Array anlege und das so regel, da schmeißt er mir aber eine NullPointerException.
Also das ist meine Kreisklasse, in der paintComponent-Methode seht ihr meinen Versuch:
Einen Punkt habe ich(mit einem etwas anderen code als oben) hinbekommen und zusammen mit dem Controller in einem Fenster mit BorderLayout zusammengefügt, wie ihr in dem angefügten Bild sehen könnt. Steuern des Punktes mit den Slidern oder per Klick funktioniert alles. Bisher sind das keine Matrizen, aber damit befasse ich mich, wenn ich das Grundgerüst erstmal habe.
Ich komm bloß nicht drauf, wie ich jetzt mehrere Punkte hinzufügen soll und diese dann einzeln per Matrizen steuern kann.
Ich müsste ja eigentlich "nur" 4 Punkte generieren und diese dann einzeln steuern können. Für das Tetraeder kann ich diese ja dann über drawLine verbinden.
Bloß habe ich gerade keinen blassen Schimmer, wie ich das angehen soll.
Außerdem, wenn ich mehrmals ein Kreisobjekt erstelle und diese dann nach und nach dem Fenster übergeben will per frame.add(kreis, BorderLayout.CENTER); , dann überschreibt er ja immer das vorher. Muss ich da also ein anderes Layout nehmen? Ich kann die ja nicht an Panel übergeben und das Panel zu dem Frame addieren, denn wenn ich den Kreis zu einem Panel addiere und dieses Panel zum Fenster, dann erscheint bei mir kein Kreis, also das Fenster bleibt in der Mitte leer.
Kann mir hier jemand weiterhelfen und mir den richtigen Denkanstoß geben / ein kleines Beispiel zeigen?
Danke schonmal und viele Grüße
ich hoffe mal, dass ich nichts übersehen habe und so eine Frage jetzt nicht zum zweiten Mal gestellt wird. Google hilft mir auch nicht wirklich weiter, da ich fast nur das Zeichnen einfacher Punkte finde etc.. (Evtl bin ich auch zu blöd zum Suchen...)
Mittlerweile habe ich leider auch gar nicht mehr richtig den Kopf dafür, bin schon den ganzen Tag am ausprobieren. Habe erst mit Java und Java-Swing angefangen und noch nicht so viel Ahnung.
Wir sollen ein Tetraeder erstellen, welches wir mit einem Controller mithilfe von Matrizen steuern sollen. (Verschiebung etc)
Mein Problem jetzt ist jedoch, dass ich keinen Plan habe, wie ich die ganzen Punkte gleichzeitig erstellen und mit dem Controller steuern soll.
Also den Controller und einen Punkt bekomme ich ja noch hin, aber wie das dann mit mehreren Punkten aussieht, da komm ich nicht drauf.
Ich habe gedacht, dass ich ein Graphics-Array anlege und das so regel, da schmeißt er mir aber eine NullPointerException.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at testerei.Kreis.paintComponent(Kreis.java:46)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1975)
at java.awt.Window.paint(Window.java:3904)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
at testerei.Kreis.paintComponent(Kreis.java:46)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1975)
at java.awt.Window.paint(Window.java:3904)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Code:
package testerei;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JPanel;
public class Kreis extends JPanel implements Observer
{
private int x=100,y=100;
private int red = 0,green=255,blue=0,alpha=255;
private int w,h;
public Kreis() {
}
@Override
public void paintComponent(Graphics g) {
Graphics[] g2 = null;
for(int i = 0; i < 4; i++) {
g2[i] = g;
System.out.println("test" + i);
super.paintComponent(g2[i]);
g2[i].setColor(new Color(red,green,blue,alpha));
g2[i].fillOval(x, y, w, h);
}
}
public void color(int r, int g, int b, int a) {
red = r; green = g; blue = b; alpha = a;
}
@Override
public void update(Observable arg0, Object arg1)
{
Controller c = (Controller) arg0;
// change position
x = c.getX();
y = c.getY();
// change width and height
w = c.getW() * c.getS();
h = c.getH() * c.getS();
// change color
color(c.getR(), c.getG(), c.getB(), c.getA());
repaint(); // muss als letztes aufgerufen werden
}
}
Einen Punkt habe ich(mit einem etwas anderen code als oben) hinbekommen und zusammen mit dem Controller in einem Fenster mit BorderLayout zusammengefügt, wie ihr in dem angefügten Bild sehen könnt. Steuern des Punktes mit den Slidern oder per Klick funktioniert alles. Bisher sind das keine Matrizen, aber damit befasse ich mich, wenn ich das Grundgerüst erstmal habe.
Ich komm bloß nicht drauf, wie ich jetzt mehrere Punkte hinzufügen soll und diese dann einzeln per Matrizen steuern kann.
Ich müsste ja eigentlich "nur" 4 Punkte generieren und diese dann einzeln steuern können. Für das Tetraeder kann ich diese ja dann über drawLine verbinden.
Bloß habe ich gerade keinen blassen Schimmer, wie ich das angehen soll.
Außerdem, wenn ich mehrmals ein Kreisobjekt erstelle und diese dann nach und nach dem Fenster übergeben will per frame.add(kreis, BorderLayout.CENTER); , dann überschreibt er ja immer das vorher. Muss ich da also ein anderes Layout nehmen? Ich kann die ja nicht an Panel übergeben und das Panel zu dem Frame addieren, denn wenn ich den Kreis zu einem Panel addiere und dieses Panel zum Fenster, dann erscheint bei mir kein Kreis, also das Fenster bleibt in der Mitte leer.
Kann mir hier jemand weiterhelfen und mir den richtigen Denkanstoß geben / ein kleines Beispiel zeigen?
Danke schonmal und viele Grüße