Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

08.11.2015, 19:45

nicht das Problem nach Fehlern zu suchen

Kennst du den Spruch:

Zitat

Aus Fehlern lernt man.
Und beim Programmieren trifft dieser besonders gut zu.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

12

08.11.2015, 20:51

Überprüf doch mal, ob der Code wirklich das macht, was du erwartest. Dazu kannst du den Debugger einsetzen oder -und das sollte in diesem einfach Beispiel ausreichen- einfach mal Ausgaben einstreuen.

Du vermutest ja, dass dein ActionListener nicht funktioniert.
Daher würde ich dort kurzerhand eine Ausgabe hinzufügen, um zu überprüfen, ob diese Methode überhaupt ausgeführt wird.

Quellcode

1
2
3
4
5
@Override
public void actionPerformed(ActionEvent e) {
    x = +5;
    System.out.println("ActionLister called");
}


Wenn du statt einer einfachen Ausgabe auch noch die Variable mit ausgibst, zum Beispiel mit...

Quellcode

1
System.out.println("ActionLister called; x="+x);

..wirst du feststellen, dass sich x nicht verändert.
Da scheint also etwas mit der Anweisung "x = +5;" nicht in Ordnung zu sein.

Kleiner Spoiler:
Wenn du dieses Problem behoben hast wird sich das Viereck leider immernoch nicht bewegen.
Überprüf dann doch mal, ob die paintComponent-Methode aufgerufen wird.

Noch kurz zum Debugger:
Auch wenn es oft ausreichend ist an verdächtigen Stellen eine Ausgabe hinzuzufügen, solltest du dich mit dem Debugger vertraut machen.
Wenn die Programme größer und komplexer werden ist es unerlässlich den Code ordentlich und umfangreich debuggen zu können.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

08.11.2015, 21:26

Der Debugger ist meiner Meinung nach allerdings wesentlich einfacher einzusetzen und sinnvoller als eine zusätzliche Ausgabe. Ich bin aber auch interessiert zu wissen, ob der Listener an sich ein Problem ist oder wie ich schon sagte eher die Tatsache, dass kein Neuzeichnen angestoßen wurde.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

14

09.11.2015, 21:07

Es sind, wie bereits angedeutet, 2 Probleme.

Die falsche Anweisung "x = +5" ist wohl offensichtlich.
Da sich x so nie verändert wird sich auch nichts bewegen.
Wird auch schwierig da das JPanel objekt leider "anonym" erstellt wurde ohne Referenzvariable
Dazu kann auch das JFrame benutzt werden.
Da das JFrame ein Container ist, reicht es den repaint()-Aufruf an alle Kindelemente (also auch an das JPanel) weiter.

Slenderguy

Frischling

  • »Slenderguy« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Schleswig-Holstein

  • Private Nachricht senden

15

12.11.2015, 19:33

Brauche dringend Hilfe !
Wieso wird hier nichts gezeichnet?, habe diesesmal eine neue Methode für das Grunggerüst genommen(Quelle: Youtube).

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Test{
    public static Test test;
    
    public Test(){
        JFrame jframe = new JFrame("Doodle_Jump");      
        jframe.setLocationRelativeTo(null);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setSize(400, 400);       
        jframe.setVisible(true);
    }
    
    public void paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.fillRect(10, 10, 10, 10);
    }
    
    public static void main(String[] args){
        test = new Test();
    }   
}

Wenn ich nach über 3 Monaten Javalernen immer noch nicht hinbekomme paint() in einem JFrame aufzunehmen und nicht weiss wie ich den ActionListener richtig einbaue, soll ich dann beser aufgeben und mit gamecreator anfangen, weil ich zu dumm bin um das zu verstehen ?
Habe schon ein 2. Javabuch (für Kids) gekauft, was mir nicht wirklich weitergeholfen hat (bin aber auch noch nicht ganz durch).

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

12.11.2015, 20:01

Ich weiß zwar nichts von JFrame und co., aber woher soll das Programm denn wissen, dass es deine paintComponent-Methode aufrufen soll?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

17

12.11.2015, 21:07

Jede AWT-Komponente besitzt eine paintComponent-Methode, die von den entsprechenden Ableitungen überschrieben werden können, damit diese wieder eigenen Code zum Zeichnen der Komponente implementieren können. Du hast bei deinem Code aber keine Ableitung implementiert.
Solltest du an dieser Stelle Verständnisprobleme damit haben, was ich meine, ist das ein Anzeichen dafür, was du dir noch anschauen musst.

Weiterhin solltest du wirklich eine separate Komponente verwenden, um deinen Spielinhalt darzustellen, statt direkt in das Fenster zu zeichnen. Auch wenn es derzeitig den Anschein macht, als würde es keinen Unterschied machen, spätestens wenn man noch weitere Elemente (Menüpunkte, Buttons, ...) darstellen will, geht es nicht anders.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

18

13.11.2015, 23:23

Wenn ich nach über 3 Monaten Javalernen immer noch nicht hinbekomme paint() in einem JFrame aufzunehmen und nicht weiss wie ich den ActionListener richtig einbaue, soll ich dann beser aufgeben und mit gamecreator anfangen, weil ich zu dumm bin um das zu verstehen ?

Habe schon ein 2. Javabuch (für Kids) gekauft, was mir nicht wirklich weitergeholfen hat (bin aber auch noch nicht ganz durch).
Programmieren ist nunmal ein komplexes Thema.. aber ich glaube es hilft auch nicht, ständig neue Beispiele zu suchen.
Bei all deinen Fragen in diesem Thread handelt es sich um Verständnisfragen zu grundsätzlichen Kontrukten (Klassen, Vererbung, Überschreiben/Überladen etc).
Wenn du also auf ein Problem stößt, weil du ein Thema noch nicht durchdrungen hast, dann solltest du da einfach dranbleiben und dich einlesen.

Gerade der Punkt mit dem Ein- bzw. Nachlesen ist unheimlich wichtig.
Ich denke die wenigsten hier (mich eingeschlossen) sind Vollzeit Java-GUI-Entwickler mit AWT oder Swing.
Zumindest ich für meinen Teil mache, um dir bei deinen Problemen zu helfen, genau das, was ich dir ans Herz lege.. ich suche, lese und probiere aus.
Die Erfahrung bzw. das erlangte Wissen sorgt schlussendlich dafür, dass du später immer seltener nachlesen musst bzw. gezielter nach der Lösung eines Problems suchen kannst.
Bis dahin dauert etwas jedoch etwas.

Nun zu deinem Problem:
Auch hier wieder mehrere Punkte.
Wie schon erwähnt, wird die paintComponent-Methode nirgendwo aufgerufen (das ist das, wofür bei deinem letzten Problem der Timer gesorgt hat).
Des Weiteren ist deine paintComponent-Methode nicht das, was du vermutlich erwartest.

Bei deinem letzten Problem hast du mit "any extends JPanel" deine Klasse "any" (man schreibt Klassen in Java übrigens groß) zu einem JPanel gemacht, da sie von diesem geerbt hat.
Die Klasse "JPanel" verfügt bereits über eine paintComponents-Methode. Diese hast du jedoch überschrieben, also sie quasi mit deiner Implementierung ersetzt.

In Java gibt es (seit Version 5) Annotationen.
Die sind ein Thema für sich, sind aber auf alle Fälle recht mächtig und verdammt nützlich.
So gibt es zum Beispiel auch die Annotation "@Override" (die du übrigens in deinem letzten Beispiel bei der actionPerformed-Methode selbst benutzt, da du dort diese Methode vom ActionListener überschreibst)

Die hat absolut keinen Einfluss auf das Überschreiben als solches, gibt deiner IDE jedoch einen Hinweis. Du machst ihr (und auch anderen Programmierern oder dir selbst, wenn du den Code nach ein paar Monaten mal wieder anschaust) damit klar, dass du beabsichtigst diese Methode zu überschreiben.

Wenn ich bei mir also die @Override-Annotation über die paintComponent-Methode setze, dann zeigt mir meine IDE den Fehler "The method paintComponent(Graphics) of type Test must override or implement a supertype method" an.

Es gibt also gar keine "supertype method" (also eine Methode einer in der Vererbungshierarchi übergeordneten Klasse), die du damit überschreiben kannst.
Und tatsächlich: Deine Klasse "Test" erbt von nichts (stimmt nicht ganz.. implizit erben in Java alle Klassen von Object).

Das heißt deine paintComponent-Methode heißt zufällig gleich und nimmt ebenfalls ein Graphics-Objekt entgegen, hat aber mit der gleichnamigen Methode einer JComponent nichts zu tun.

Nun könntest du sie von JFrame oder JPanel erben lassen, bräuchtest dann jedoch wieder etwas, dass das Malen anstößt.. nimmst du hierfür einen Timer wärst du quasi wieder beim gleichen Stand wie beim letzten mal.

Ich weiß, man möchte immer ganz schnell was sehen und freut sich tierisch, wenn sich das Viereck das erste mal bewegt.. aber allein durch copy&paste von unterschiedlichen Quellen lernst du nichts.
Mit etwas Glück stößt du mal auf ein Codeschnipsel, der nach copy&paste tatsächlich funktioniert, aber wirklich verstanden hast du es dann ja immer noch nicht.

Java hat mit den javadocs (solltest du Java in einer anderen Version nutzen, dann ändere in der URL einfach die "8") umfangreiche Dokumentationen, die sogar in der IDE selbst verfügbar sind und teilweise den Umfang ganzer Tutorials haben.

Konntest du dein letztes Problem eigtl. lösen?

Slenderguy

Frischling

  • »Slenderguy« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Schleswig-Holstein

  • Private Nachricht senden

19

15.11.2015, 17:54

Nach 3 Versuchen habe ich es endlich richtig hinbekommen.
Erstes Problem war das ich nicht wusste das man auserhalb der public class weitere Klassen erstellen kann.
Aber dennoch will etwas nicht richtig laufen.

Quellcode

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
public class Pong_Spiel {
    
    public static void main(String[] args){
        JFrame jframe = new JFrame("Ping-Pong");
        jframe.setSize(400, 400);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setVisible(true);
        
        AnyClass any = new AnyClass();
        
        jframe.add(any);
    }
}
  class AnyClass extends JPanel{
    public int var = 0;
    public ActionListener action;
    Timer timer;
    
     public AnyClass(){
         timer = new Timer(100, action);
         timer.start();
         action = new ActionListener(){
             public void actionPerformed(ActionEvent e){
                 
                 repaint();
             }
         };      
     }
     
     public void paintComponent(Graphics g){
         super.paintComponent(g);
         g.fillRect(var, 0, 200, 200);
     } 
}

Var wird nicht bewegt/ getriggert oder wie man es auch nennt.

Ich schreibe die Codes meistens selber ab, also kann man das nicht wirklich Copy and Paste nennen, ich übernehme nur die wichtigsten Grundsätze.

Danke an @JailSoft für den Code und alle weiteren für eure Hilfe.

@InselÄffchen

Zitat

Konntest du dein letztes Problem eigtl. lösen?
Ja, kann man so sagen, danke für deine Erklärungen.

Slenderguy

Frischling

  • »Slenderguy« ist der Autor dieses Themas

Beiträge: 53

Wohnort: Schleswig-Holstein

  • Private Nachricht senden

20

15.11.2015, 18:34

Quellcode

1
g.setColor(Color.orange);

Klappt nicht

Edit: Mein Bildschirm/Frame ist Weiss

Werbeanzeige