Zeichnen

Phänox

Aktives Mitglied
Hallo,
Ich weiß nicht wieso aber ich bekomme es nicht hin eine simple sache zu zeichnen entweder ich habe etwas grundlegend nicht verstanden oder es ist ein fehler den ich nicht sehen.
Meine Spiele klasse wo das JFrame sich befindet und dort soll das rechteck erscheinen
Code:
public class Game extends JFrame  {
 
 
    public static void main(String[] args)
    {
        JFrame game = new JFrame();
        game.setVisible(true);
        game.setSize(1000, 1000);
     
        Spielfeld dc = new Spielfeld();
        game.add(dc);
   }
}
Und hier die Klasse wo das Rechteck gezeichnet wird
Code:
public class Spielfeld {

public void zeichen(Graphics g)
        {
         
          Graphics2D g2 = (Graphics2D) g;
         
          g2.drawRect(100, 100, 100, 50);
         
         
        }
}
Simple frage: Wie schaffe ich es das es da ist Jframe wird gemacht aber das rechteck nicht!
Und wenn ihr mir noch erklären könnten wo mein fehler Lag beziehungsweiße wie das zeichnen abläuft wäre das echt super !

Danke im voraus :)
 

Robat

Top Contributor
1. Das was du deinem JFrame addest ist kein JPanel.
2. Wenn dein Spielfeld zu einem JPanel geworden ist solltest solltest du die Methode paintComponent(Graphics g) überschreiben.
Dort kannst du dann zeichnen.
 

Phänox

Aktives Mitglied
Vielen Dank ! es hat geklappt nur verstehe ich nicht ganz warum? mir ist klar das ich die Klasse zu einem Jpanel "gemacht" habe aber warum klappt es dann nicht mit meiner Methode sondern nur mit ihrer?
 

Phänox

Aktives Mitglied
Ich weiß nicht ob das noch hier rein passt aber ich möchte mehrer Rechtecke zeichnen lassen, und dann habe ich angefangen jedes Rechteck zu erstellen. Dann hab ich überlegt ob das nicht besser geht und kam auf diesen code
Code:
public void paintComponent(Graphics g)
   
    {
        Graphics2D g2 = (Graphics2D) g;
        Rectangle rec1 = new Rectangle(0,0,180,135); 
          g2.draw(rec1);
        while( i<10)
        {
            i++;
            g2.drawRect(0, 135+(i*90), 180, 90);
        }
       
         
       
    }
Er zeichnet nur das Große Rechteck aber die 9 kleinen nicht warum nicht? muss ich jedes einzelne was ich erstellt habe noch irgendwo speichern z.B in einem array? und wenn ja wie mach ich das dann?
 

Robat

Top Contributor
Dein Code sollte eigentlich funktionieren.

Ich denke mal, dass es an deinem i liegt. Versuch mal i am Anfang deiner paintComponent(Grahpics g) Methode auf 0 zu setzen.

Das mit der ArrayList kann man machen.
Solltest du sicherlich auch, da du ja anhand der Position des Rechteckes die Position deiner Spieler bestimmen willst.

Das könntest du machen, in dem du dir eine ArrayList<Rectangle> erstellst und im Konstruktor deiner Klasse x Elemente hinzufügst. (keine Ahnung wie viele du brauchst).
In deiner paintComponent(Graphics g) Methode durchläufst du dann das Array mit einer for / for-each und zeichnest das Element.

Gruß
Robert
 

Phänox

Aktives Mitglied
Es hat alles geklappt *_* (Happy)
es gibt nur noch eine Sache die ich brauche und zwar möchste ich jedem Rechteck eine Nummer geben.
Weil ein Monopoly Spiel hat ja 40Felder und dann möchte ich überprüfen auf welchen feld(nummer) er steht und dann kann ich die zahl dazurechnen die er gewürfelt hat und dann hab ich die nummer des Feldes auf die er muss und damit dann auch die Koordinaten aber wie kann ich einem rechteckt noch eine Extra nummer geben?
 

Phänox

Aktives Mitglied
Hab ich auch schon drangedacht nur leider geht das nicht. Ich mach dir mal schnell ein Bild.
Bild: http://prntscr.com/df85gu
Code:
private int i=0;
    ArrayList<Rectangle> Spiellinks= new ArrayList<Rectangle>(); 
    ArrayList<Rectangle> Spieloben= new ArrayList<Rectangle>(); 
    ArrayList<Rectangle> Spielrechts= new ArrayList<Rectangle>(); 
    ArrayList<Rectangle> Spielunten= new ArrayList<Rectangle>(); 
   
   
   
       
       
       
       
    public void paintComponent(Graphics g)
   
    {
        while(i<9)
        {
            Spiellinks.add(new Rectangle(0, 160+(i*80), 160, 80));
            Spieloben.add(new Rectangle(160+(i*80), 0, 80, 160));
            Spielrechts.add(new Rectangle(880, 160+(i*80), 160, 80));
            Spielunten.add(new Rectangle(160+(i*80), 880, 80, 160));
            i++;
             
        }
         
         
        Graphics2D g2 = (Graphics2D) g;
        Rectangle rec1 = new Rectangle(0,0,160,160); 
          g2.draw(rec1);
          Rectangle rec2 = new Rectangle(0,880,160,160); 
          g2.draw(rec2);
          Rectangle rec3 = new Rectangle(880,0,160,160); 
          g2.draw(rec3);
          Rectangle rec4 = new Rectangle(880,880,160,160); 
          g2.draw(rec4);
        for(int i=0; i < 9; i++)
        {
             
            Rectangle l = Spiellinks.get(i);
            g.drawRect(l.x, l.y, l.width, l.height);
            Rectangle o = Spieloben.get(i);
            g.drawRect(o.x, o.y, o.width, o.height);
            Rectangle r = Spielrechts.get(i);
            g.drawRect(r.x, r.y, r.width, r.height);
            Rectangle u = Spielunten.get(i);
            g.drawRect(u.x,u.y, u.width, u.height);
             
        }
So da ich 4 arrays brauche und 4 einzelne rechtecke und das so hinzubekommen bringt mir der index leider nichts ;( daher muss ich jedem rechteck noch eine Nummer geben aber wie ?:/

Danke im voraus
 

Robat

Top Contributor
So da ich 4 arrays brauche
Brauchen ist der falsche Ausdruck. Du kannst es definitiv auch mit einem Array und 4 if-Abfragen machen. (Wenn du das Array befüllst).

Gibt aber auch noch andere Lösungen:
Eine wäre bspw. dir deine eigene Rect Klasse zu schreiben. Die Rect-Klasse hat 2 Variablen. 1 Rectangle und eine ID.
Java:
public class MyRect {

    private int id;
    private Rectangle r;

   public MyRect(int id, Rectangle r)
   {
        this.id = id;
        this.r = r;
   }

   public Rectangle getRect() { return this.r; }
   public int getId() { return this.id; }

}

So kannst du über die Getter die ID und das Rect bekommen :)
 

Phänox

Aktives Mitglied
Stimmt über ifabfragen würde es gehen. Die class idee gefällt mir sehr gut nur irgendwie verstehe ich nicht wie ich dann jedem rechteck eine eigene id geben beziehunbgsweiße wie verbinde ich die arrays dann mit der classe rechteck? oder brauche ich die arrays dann nicht mehr?. Wäre super nett wenn du mir ein Beispiel geben könntest.
Und falls es dich interessiert wieso ich das alles überhaupt mache beziehungeiße wissen möchte. ich bin zurzeit schüler und habe sehr viel spaß am programmieren. In der schule haben wir dieses jahr mit java angefangen jedoch geht das alles sehr langsam voran und ich langweile mich sehr schnell im unterricht daher versuche ich mir selbst herausvorderungen zu stellen und mir alles im Internet anzueignen nur wenn ich dann vor einem problem stehe und diesen nicht verstehe beziehungsweiße nicht im internet zu finden ist hab ich ein probelm. Mein Lehrer kann meistens mir nicht helfen da er ja Unterricht machen muss:(
 

Robat

Top Contributor
Doch doch die Arrays brauchst du dann trotzdem noch.

Java:
ArrayList<MyRect> arrLeft = new Array List<MyRect>();

for(int i = 0; i < 5; i++)
{
    // Denk dran, der Konstruktor der MyRect Klasse hat folgende Params (int id, Rectganle r)
    arrLeft.add(i, new Rectangle(x, y, width, height));
    // i = deine id
    // für x, y, width und height musst du noch Werte einsetzen :)
}

Find ich gut, dass du jetzt schon anfängst. Mir ging es genauso in der Schule :p
 

Phänox

Aktives Mitglied
Ah ok vielen Danke ! jetzt abe ich es kapiert und wenn ich dann in der Spielerklasse die methode würfeln z.B aufrufe kann ich dann die id von spieler nehmen plus die zahl von dem gewürfelteten ergebnis und dann muss ich ja irgendwie die koordinaten von dem Rechteck bekommen dem der summe enstpricht wie mache ich das dann ? also zum Beispiel die erste runde Spieler1 hat id 0 und würfelt eine 7 dann setzte ich seine id auf 7 und brauche die koordinaten von dem rechteck mit der id 7 damit ich diese dann auf die von dem spieler setzten kann wie geht das?
 

Robat

Top Contributor
Nicht ganz.

Nehmen wir mal du hast die Methode Spieler#wuerfelUndBewegeSpieler();.

Durch das würfeln bekommst du eine Zahl zwischen 1 und 6.
Deine Spielerklasse sollte eine Variable beinhalten, die die ID des Rechtecks auf dem der Spieler steht repräsentiert. int currRectId;

Was du jetzt machen willst ist folgendes:

-Du nimmst dir die Augenzahl des Würfels und addierst sie auf deine currRectId.
(Achtung: Hier musst du prüfen ob die Summe größer ist als deine max. Anzahl an Feldern. Wenn ja dann musst du das abfangen und behandeln.)

- Mit der Summe holst du dir jetzt aus der entsprechenden ArrayList (Stichwort: if-Abfrage und Schleife ) das Rechteck. Über das Rechteck kannst du dann mit der Methode Rectangle#getBounds().x und Rectangle#getBounds().y die X und Y Koordinate holen

- Jetzt musst du mit den o.g. Koordinaten noch die Koordinaten deines Spielers updaten


Gruß
Robert
 

Phänox

Aktives Mitglied
Muss ich eine schleife machen? gibt es keine möglichkeit das richtige Rechteck gleich zu finden? und muss bei getbounds ein # sein? und ich kann ja dann einfach schreiben Spielerkooy = Rectangle#getbounds().y und genauso mit x richtig?
 

Robat

Top Contributor
Spielerkooy = Rectangle#getbounds().y und genauso mit x richtig?
Jupp, genau.

und muss bei getbounds ein # sein?
Nein. Das # ist nur eine Schreibweise um u.a. in JavaDocs zuzeigen wo die Methode herkommt. Es muss wie immer rect.getBounds().x; heißen.

Muss ich eine schleife machen?
Ich sag mal so.. So wie der Code momentan aufgestellt ist ist es die einfachste Möglichkeit.
Wenn man sich vorher mal hinsetzt und sich ein Konzept überlegt kommt man da sicherlich drum rum.
Aber gerade bei den 4 versch. ArrayListen ist es am Sinnvollsten mittels einer if und der ID zu schauen in welcher ArrayList das Rechteck liegt und dann mit einer
for-each solange durch das Array zu laufen bis man das Rechteck mit der entsprechenden ID gefunden hat.

Gruß
Robert
 

Phänox

Aktives Mitglied
So ich habe jetzt meine Spielfeld klasse so angepasst wie ich dachte das es richtig ist und du es mir erklärt beziehungsweiße gezeigt hast
Code:
public class Spielfeld extends JComponent{
    private int id;
    private Rectangle r;
    private int i=0;
    ArrayList<Spielfeld> Spiellinks= new ArrayList<Spielfeld>(); //ich erstelle alle arrays
    ArrayList<Spielfeld> Spieloben= new ArrayList<Spielfeld>(); 
    ArrayList<Spielfeld> Spielrechts= new ArrayList<Spielfeld>(); 
    ArrayList<Spielfeld> Spielunten= new ArrayList<Spielfeld>(); 
   
   
   
    public Spielfeld(int id, Rectangle r)//neue Medothe mit den parametern id und rechteck
      {
           this.id = id;
           this.r = r;
           Rectangle rec1 = (1,new Rectangle(0,0,160,160);//die 4 rechtecke jeweils and den 4 ecken mit den ids 
           Rectangle rec1 = (11,new Rectangle(0,0,160,160); 
           Rectangle rec1 = (21,new Rectangle(0,0,160,160); 
           Rectangle rec1 = (31,new Rectangle(0,0,160,160); 
           for(int i = 2; i < 11; i++)// 4 for da ich ja verschiedene ids haben will
            {
                Spiellinks.add(i, new Rectangle(0,160+(i*80),160,80);
            }
           for(int i = 12; i < 21; i++)
            {
                Spieloben.add(i, new Rectangle(0,160+(i*80),160,80);
            }
           for(int i = 22; i < 31; i++)
            {
                Spielrechts.add(i, new Rectangle(0,160+(i*80),160,80);
            }
           for(int i = 32; i < 41; i++)
            {
                Spielunten.add(i, new Rectangle(0,160+(i*80),160,80);
            }
      }
       
       
       
    public void paintComponent(Graphics g)// alles zeichnen lassen
   {
        Graphics2D g2 = (Graphics2D) g;
         g2.draw(rec1);
          g2.draw(rec2);
          g2.draw(rec3);
          g2.draw(rec4);
        for(int i=0; i < 9; i++)
        {
             
            Rectangle l = Spiellinks.get(i);
            g.drawRect(l.x, l.y, l.width, l.height);
            Rectangle o = Spieloben.get(i);
            g.drawRect(o.x, o.y, o.width, o.height);
            Rectangle r = Spielrechts.get(i);
            g.drawRect(r.x, r.y, r.width, r.height);
            Rectangle u = Spielunten.get(i);
            g.drawRect(u.x,u.y, u.width, u.height);
             
        }
 }
Leider funktioniert es nicht also er zeigt fehler schon dort an wo ich die rec1 und rec2 etc definiere und wo ich die rechtecke in das array machen will.
voran liegt das ?
gruß Philipp
 

Robat

Top Contributor
er zeigt fehler schon dort an wo ich die rec1 und rec2 etc definiere
Poste nächstes mal bitte direkt den Fehler :)


ArrayList<Spielfeld> Spiellinks= new ArrayList<Spielfeld>(); //ich erstelle alle arrays
ArrayList<Spielfeld> Spieloben= new ArrayList<Spielfeld>();
ArrayList<Spielfeld> Spielrechts= new ArrayList<Spielfeld>();
ArrayList<Spielfeld> Spielunten= new ArrayList<Spielfeld>();

Wenn du eine ArrayList erstellst, dann spezifiziert der Ausdruck in der <..> die Art der Elemente in der ArrayList.
Was du ihm sagst ist, dass in deiner ArrayList Elemente vom Typ Spielfeld sind.
In Wahrheit hast du aber Elemente vom Typ MyRect :)

[Wenn du magst können wir das auch privat in einer Unterhaltung klären. Dann spamen wir hier nicht das Forum voll :) ]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Habe ein svg bild, kann ich das zu svg koordinaten umrechnen, damit ich den Umriss zeichnen kann? Wenn ja wie? Allgemeine Java-Themen 1
Aboya Kugel mit Hilfe von Dreiecken rekursiv zeichnen Allgemeine Java-Themen 2
F Linie zeichnen Allgemeine Java-Themen 35
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
S Best Practice Diagramm zeichnen Allgemeine Java-Themen 0
C Tortendiagramm zeichnen Allgemeine Java-Themen 3
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
D Baum zeichnen hilfe Allgemeine Java-Themen 4
B Zeichnen einer verschiebbaren Linie Allgemeine Java-Themen 3
I 2D-Grafik Polygon mit Double Werten zeichnen Allgemeine Java-Themen 4
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
E Tool/Programm zum Zeichnen von UML Diagrammen Allgemeine Java-Themen 14
F 2D-Grafik drawString (scharf zeichnen lassen) Allgemeine Java-Themen 13
J Teil eines Image/ImageIcon zeichnen Allgemeine Java-Themen 2
D Lösung Differentialgl. mit RungeKutta + Kurve zeichnen Allgemeine Java-Themen 3
U Zeichnen mit JFrame. Allgemeine Java-Themen 5
lenniii zeichnen Allgemeine Java-Themen 2
N Tepich zeichnen Allgemeine Java-Themen 8
K Zeichnen auf ein Bild und Scrollen Allgemeine Java-Themen 7
S Problem mit Zeichnen Allgemeine Java-Themen 8
L Buffered Image teilweise zeichnen Allgemeine Java-Themen 6
B Tool zum Zeichnen von Systemarchitektur Allgemeine Java-Themen 2
MasterEvil Lib zum zeichnen von Baumdiagrammen? Allgemeine Java-Themen 4
O TimeSeriesChart Linien Fetter Zeichnen Allgemeine Java-Themen 2
B Programmablaufgraph erstellen und zeichnen Allgemeine Java-Themen 2
H Sinusähnliche Kurve mit Paint zeichnen! Allgemeine Java-Themen 3
G Bild neu zeichnen Allgemeine Java-Themen 13
E Pixelweise auf einem JPanel/JLabel o.ä. zeichnen Allgemeine Java-Themen 4
L Linien, Recktecke und Elipsen zeichnen ohne Image Allgemeine Java-Themen 2
R Grafiken. direkt zeichnen Allgemeine Java-Themen 5
S Auf vorhandenes Window zeichnen? Allgemeine Java-Themen 2
G BufferedImage zeichnen Allgemeine Java-Themen 4
S Vierecke zeichnen Allgemeine Java-Themen 18
T Rechtecke usw mit Paint auf Panel zeichnen Allgemeine Java-Themen 5
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2
J Fenster mit paint Methode selbst zeichnen Allgemeine Java-Themen 3
A Zeichnen mit JAVA ! Allgemeine Java-Themen 3
T Linien-Diagramm zeichnen Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben