Zeichnen

Dieses Thema Zeichnen im Forum "Allgemeine Java-Themen" wurde erstellt von Phänox, 3. Dez. 2016.

Thema: Zeichnen Hallo, Ich weiß nicht wieso aber ich bekomme es nicht hin eine simple sache zu zeichnen entweder ich habe etwas...

  1. 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 (Text):

    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 (Text):

    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 :)
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. 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 gefällt das.
  4. 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?
     
  5. 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 (Text):

    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?
     
  6. 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
     
  7. 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?
     
  8. Du kannst den Index des Rechtecks in der ArrayList benutzten :)

    Gruß
    Robert
     
  9. Hab ich auch schon drangedacht nur leider geht das nicht. Ich mach dir mal schnell ein Bild.
    Bild: http://prntscr.com/df85gu
    Code (Text):

    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
     
  10. 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.
    Code (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 :)
     
  11. 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:(
     
  12. Doch doch die Arrays brauchst du dann trotzdem noch.

    Code (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
     
  13. 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?
     
  14. 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
     
  15. 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?
     
  16. Jupp, genau.

    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.

    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
     
  17. 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 (Text):

    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
     
  18. Poste nächstes mal bitte direkt den Fehler :)


    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 :) ]
     
  19. Private Unterhaltung klingt super :)!
     
  20. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!