1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

JFrame problem

Dieses Thema im Forum "Swing, Java2D/3D, SWT, JFace" wurde erstellt von javaman13, 16. März 2012.

  1. javaman13

    javaman13 Grünschnabel

    Hallo Leute!
    Ich habe ein kleines Problem, nämlich, dass ich die Klasse in der ich das .drawImage() habe einfügen will.
    Wie geht das, oder besser gesagt, geht das überhaupt?

    Code (Java):
    1.  
    2. package Game;
    3.  
    4. import javax.swing.*;
    5.  
    6. public class Frame {
    7.  
    8.         public Frame(){
    9.                 JFrame frame = new JFrame();
    10.                 frame.add(new Level());
    11.                 frame.setTitle("GotT");
    12.                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    13.                 frame.setSize(700,365);
    14.                 frame.setVisible(true);
    15.                 frame.setLocationRelativeTo(null);
    16.         }
    17.         public static void main(String[] args){
    18.                 new Frame();
    19.         }
    20. }
    Hier die zweite Klasse:
    Code (Java):
    1. package Game;
    2.  
    3. import java.awt.*;
    4. import java.awt.event.ActionEvent;
    5. import java.awt.event.ActionListener;
    6.  
    7. import javax.swing.*;
    8.  
    9.  
    10. public class Level implements ActionListener {
    11.    
    12.     WorldGenerator2 g;
    13.     Keys k;
    14.     Timer t;
    15.  
    16.    
    17.     Image q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22, q23, q24, q25, q26, q27, q28, q29, q30, q31, q32;
    18.     Image q33, q34, q35, q36, q37, q38, q39, q40, q41, q42, q43, q44, q45, q46, q47, q48, q49, q50, q51, q52, q53, q54, q55, q56, q57, q58, q59, q60;
    19.    
    20.     int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32;
    21.     int x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60;
    22.  
    23.     int y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14, y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27, y28, y29, y30, y31, y32;
    24.     int y33, y34, y35, y36, y37, y38, y39, y40, y41, y42, y43, y44, y45, y46, y47, y48, y49, y50, y51, y52, y53, y54, y55, y56, y57, y58, y59, y60;
    25.    
    26.     int dx = k.getdx();
    27.     int dy = k.getdy();
    28.    
    29.     public void timer(){
    30.             t = new Timer(5, this);
    31.     }
    32.     public void geti()
    33.     {
    34.         q1 = g.getImage1();
    35.         q2 = g.getImage2();
    36.         q3 = g.getImage3();
    37.         q4 = g.getImage4();
    38.         q5 = g.getImage5();
    39.         q6 = g.getImage6();
    40.         q7 = g.getImage7();
    41.         q8 = g.getImage8();
    42.         q9 = g.getImage9();
    43.         q10 = g.getImage10();
    44.         //holt sich 60 Images aus einer anderen Klasse
    45.     }
    46.  
    47.     public void x(){        //Definiert die x Koordinate
    48.         x1 = 300;
    49.         x2 = 200;
    50.         x3 = 400;
    51.         x4 = 300;
    52.         x5 = 300;
    53.         x6 = 400;
    54.         x7 = 500;
    55.         x8 = 500;
    56.         x9 = 400;
    57.         x10 = 500;
    58.         //auch wieder für 60 Bilder
    59.     }
    60.    
    61.     public void y(){            //Definiert die y Koordinate
    62.         y1 = 300;
    63.         y2 = 300;
    64.         y3 = 400;
    65.         y4 = 400;
    66.         y5 = 500;
    67.         y6 = 400;
    68.         y7 = 200;
    69.         y8 = 300;
    70.         y9 = 500;
    71.         y10 = 400;
    72.         //immer noch 60 Bilder
    73.     }
    74.    
    75.     public void move(){         //Macht es möglich, dass der Hintergrund sich bewegt
    76.         x1 = x1 + dx;
    77.         x2 = x2 + dx;
    78.         x3 = x3 + dx;
    79.         x4 = x4 + dx;
    80.         x5 = x5 + dx;
    81.         x6 = x6 + dx;
    82.         x7 = x7 + dx;
    83.         x8 = x8 + dx;
    84.         x9 = x9 + dx;
    85.         x10 = x10 + dx;
    86.                 // das ganze + dx
    87.  
    88.         y1 = y1 + dy;
    89.         y2 = y2 + dy;
    90.         y3 = y3 + dy;
    91.         y4 = y4 + dy;
    92.         y5 = y5 + dy;
    93.         y6 = y6 + dy;
    94.         y7 = y7 + dy;
    95.         y8 = y8 + dy;
    96.         y9 = y9 + dy;
    97.         y10 = y10 + dy;
    98.         //plus dy
    99.     }
    100.    
    101.     public void paint(Graphics g2){
    102.         Graphics2D g2d = (Graphics2D) g2;       //Sollte eigentlich alles am Bildschirm ausgeben
    103.        
    104.         g2d.drawImage(q1, x1, y1, null);
    105.         g2d.drawImage(q2, x2, y2, null);
    106.         g2d.drawImage(q3, x3, y3, null);
    107.         g2d.drawImage(q4, x4, y4, null);
    108.         g2d.drawImage(q5, x5, y5, null);
    109.         g2d.drawImage(q6, x6, y6, null);
    110.         g2d.drawImage(q7, x7, y7, null);
    111.         g2d.drawImage(q8, x8, y8, null);
    112.         g2d.drawImage(q9, x9, y9, null);
    113.         g2d.drawImage(q10, x10, y10, null);
    114.         //und dann für alle Bilder g2d.drawImage
    115.     }
    116.     public void actionPerformed(ActionEvent arg0) {     //Sorgt dafür, dass move und paint immer upgedated wird
    117.         paint();
    118.         move();
    119.     }
    120. }
    121.  
    Ja ich benutze keine ArrayList oder ähnliches für move() in Level.
    Und auch ja, ich bin ein Anfänger.:p

    Sorry für den langen Post
    javaman
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  2. genodeftest

    genodeftest Erfahrenes Mitglied

    Hi und willkommen im Forum
    1. Dein Code ist Java, also schreib ihn doch bitte auch in java-Tags (siehe meine Signatur).

    2. Zu deiner ersten Klasse: Sind das 2 verschiedene Dateien? Wenn ja, pack sie doch in 2 Code-Blöcke. Wenn nein, hast du da bereits ein paar Fehler, weil du z.B. nicht mehrere Anweisungen 'package xyz' in eine Datei packen kannst. Außerdem hast du 2 mal die gleiche Klasse in einer Datei deklariert, das willst du bestimmt nicht!

    3. Es empfiehlt sich nicht, das Programmieren mit Spielen anzufangen. Vielleicht solltest du erst mal die Grundlagen lernen. Dazu solltest du dir ein Buch über Java besorgen oder http://openbook.galileocomputing.de/javainsel/ größtenteils durcharbeiten

    4. Zu deinem Problem mit den Bildern: Du brauchst erst mal eine Quelle, von der du die Bilder laden willst (Dateiname, Ort im Paket / URL / …). Und dann lädt man Bilder üblicherweise mit ImageIcon oder BufferedImage (je nach Anwendungszweck), wie auch im 2. Band der JavaInsel, http://openbook.galileocomputing.de/java7/ in den Kapiteln 9.3 und 10.6 beschrieben ist.

    5. Ich verstehe zwar nicht, was du machst, aber bei so vielen Bildern rentiert es sich, Arrays, Listen oder ähnliche Datenstrukturen zu verwenden. (Grundlagen)
  3. javaman13

    javaman13 Grünschnabel

    Wie du natürlich nicht wissen kannst sind alle bilder schon in einer anderen klasse deklariert und werden nur in die Klasse Level geholt.

    Die Grundlagen beherrsche ich durchaus, zum nachlesen für manche dinge benutze ich auch immer wieder dieses Buch(im Internet). Trotzdem konnte ich in ihm meine Rrage niht beantworten.

    Mit den zwei Klassen und der trennung sollte es jetzt auch passen.

    LG
    javaman
  4. genodeftest

    genodeftest Erfahrenes Mitglied

    Nein, dein 1. Code-Block compiliert so nicht mal. Weil du
    • 2 gleichnamige Klassen in einer Datei hast
    • 2 package-Deklarationen in einer Datei hast
    • 2 Klassen der Sichtbarkeit 'public' in einer Datei hast
    und evtl. noch ein paar andere Gründe.

    Und auch der Code der 2. Klasse ist nicht Ok. Warum schreibst du beispielsweise für jedes Bild eigene Variablen, Methoden, etc.? Das ist richtig umständlich und dein Code wird so nicht wiederverwendbar, sondern sehr statisch.

    Zeichnen solltest du deine Elemente in einer paintCompontent()-Methode in einer Klasse, die von JPanel erbt. Dieses JPanel musst du natürlich dem JFrame hinzufügen.
  5. javaman13

    javaman13 Grünschnabel

    Oh sorry, das doppelte war ein Fehler beim einfügen, da ich zuerts nicht alles kopiert hatte.

    Mit dem zweiten hast du recht, dass werde ich noch ändern müssen, da später noch andere Level dazukommen.
  6. genodeftest

    genodeftest Erfahrenes Mitglied

    Achtung:
    Du solltest zum Zeichnen die paintComponent()-Methode eines JPanels überschreiben. Das Zeichnen wird mit repaint() angestoßen. Und bewege deine Objekte doch, bevor du sie zeichnest.
  7. javaman13

    javaman13 Grünschnabel

    Was meinst du denn mit:
    "Und bewege deine Objekte doch, bevor du sie zeichnest."
    Sonst danke
  8. genodeftest

    genodeftest Erfahrenes Mitglied

    move() vor repaint() ausführen. Und die Sachen mit dem Zeichnen sind echt Grundlagen, die du dir am besten erst mal aneignest (aus einem Buch).
  9. javaman13

    javaman13 Grünschnabel

    achso
    Verstehe
  10. javaman13

    javaman13 Grünschnabel

    Ich habe schon wieder ein problem:
    um repaint ausführen zu können braucht man: super.paint(g)
    so etwa
    Code (Java):
    1. public void paint(Graphics g){
    2.         super.paint(g); //das hier
    3.         Graphics2D g2d = (Graphics2D) g;
    4.  
    Das problem dabei ist, das Eclipse mir folgenden Fehler schreibt:
    The method paint(Graphics) is undefined for the type Object.

    warum****?
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  11. Akeshihiro

    Akeshihiro Erfahrenes Mitglied

    Von welcher Komponente erbt denn deine?
  12. javaman13

    javaman13 Grünschnabel

    oh genau... danke, ich hatte vergessen bei der Klasse JPanel einzufügen.
  13. Akeshihiro

    Akeshihiro Erfahrenes Mitglied

    Trotzdem sollst du bei Swing nicht paint(Graphics), sondern paintComponent(Graphics) überlagern.
  14. javaman13

    javaman13 Grünschnabel

    Das habe ich gemacht, trotzdem gibt es immer noch nichts aus, der frame ist leer!
  15. Akeshihiro

    Akeshihiro Erfahrenes Mitglied

    Also ich habe jetzt mal ein lauffähiges Programm aus dem gebastelt, was du uns gepostet hast. Ich musste aber paar Sachen ändern und dazubasteln, weil sehr viel fehlt. Wie wäre es, wenn du vielleicht den gesamten Code postest oder das Projekt als Anhang einfügst? Das würde uns einiges erleichtern.

    Das Problem ist zum einen, dass wir nicht wissen, was du vor hast und zum anderen, dass du entweder die Grundlagen noch nicht richtig verinnerlicht hast oder dich mit GUI-Programmierung noch nicht richtig vertraut gemacht hast oder aber damit einfach nicht klar kommst. Ist kein Angriff oder sowas, aber irgendwo muss man ansetzen können, damit das voran kommt.
  16. javaman13

    javaman13 Grünschnabel

    GUi programmierung ist für mich tatsächlich noch sehr neu

    So hier die gesamten dateien!
    Hätte ich eigentlich schon ganz am Anfang machen sollen :(
    Naja
    LG
    javaman

    P.S. Bitte readme lesen!

    EDIT: Hier der erneuerte link! Hab das ganze mit Arrays ein wenig automatisiert. : )

    Anhänge:

    • GotT.zip
      Dateigröße:
      412 KB
      Aufrufe:
      9
    Zuletzt bearbeitet: 25. März 2012
  17. Akeshihiro

    Akeshihiro Erfahrenes Mitglied

    Hab mir das Projekt mal gezogen und auch schon reingeschaut. Übrigens netter versuch einem beizubringen, wie man ein Eclipseprojekt importiert ;)

    Hast du ICQ oder sowas?
  18. genodeftest

    genodeftest Erfahrenes Mitglied

    @javaman: Ich empfehle dir, deine Mail-Adresse aus dem Readme / ZIP-Ordner zu tun, weil du die Adresse damit den SPAM-Bots aussetzt, die dürften so etwas finden.

    Zu dem Code:
    1. Paketnamen schreibt man laut Konvention klein
    2. wie vorhin schon, solltest du Guy.paint() durch Guy.paintComponent() ersetzten. In der Dokumentation steht explizit:
    , d.h. du brauchst dich um den Rand und die Kind-Elemente nicht mehr kümmern, wenn du nur die paintComponent() überschreibst.

    3. Die Klasse Keys sollte KeyListener implementieren oder von KeyAdapter erben und jeweils Methoden überschreiben. Aktuell können die Keys nicht verarbeitet werden. Wie das funktioniert, findest du in handelsüblichen Büchern!

    4. Die Klassen WorldGenerator2 und Level schreien nach Automatisierung…
  19. Akeshihiro

    Akeshihiro Erfahrenes Mitglied

    Ok, so knapp hätte ich das jetzt nicht zusammenfassen können ...
  20. javaman13

    javaman13 Grünschnabel

    Danke! Hab das mal getan(außer dei Automatisierung, da ich mich mit Arrays und ArrayLists nicht wirklich vertrage) und es zeigt auch schon das Männchen an.

    Mein Problem ist nur, dass der Hintergrund noch fehlt... Zuerst dachte ich das dauert nur eine Weile, aber nach einer stunde bin ich mir sicher, dass es nicht funktioniert.
    Auch seltsam ist, dass ich bei dem .drawImage des Männchen nur Koordinaten zwischen 500 und 600 eingeben kann, da es sonst nicht mehr sichtbar ist...?

    Schon mal danke für die wieder sicher hilfreichen Tipps(keine Angst ich suche auch).
    LG
    javaman

    EDIT: Warum kommen da immer Sternchen, wenn ich drei Ruf-, oder Fragezeichen mache****?
    Zuletzt bearbeitet: 18. März 2012

Diese Seite empfehlen