Positie van JPanel verandert als inhoud verandert

Status
Niet open voor verdere reacties.

Asteroid999

Gebruiker
Lid geworden
20 jan 2009
Berichten
19
Ik ben een programma aan het maken dat reageert op pijltje toetsen. In een JFrame maak ik een JPanel, waarin weer een cirkel wordt getekend. Als op links wordt gedrukt, beweegt de cirkel naar links, als op rechts wordt gedrukt naar rechts, etc. Dit werkt allemaal prima, alleen mijn enige probleem is, dat het JPanel ook wordt verplaatst als ik de cirkel verplaats!

Ik heb al het een en ander geprobeerd om dit op te lossen (layout veranderen, spelen met afmetingen van panel en frame, etc), maar het wil nog niet echt lukken... Ik heb al wel eerder gemerkt dat Java nogal vreemd omgaat met waar je knoppen en panels e.d. plaatst. De cirkel kan in theorie ook niet verder dan de breedte/hoogte van je beeldscherm, maar hij gaat er gewoon buiten, en stop pas als die twee keer zo ver is.

Ik heb de jar bijgevoegd, en mijn broncode.

Uitleg classes:
- Main is de GUI, deze tekent het JFrame en voegt het JPanel toe aan het frame.
- Draw is het JPanel, hierin wordt de cirkel getekend, hierin wordt ook bijgehouden op welke toetsen is gedrukt (eigenlijk moet ik voor die toetsen nog een KeyPressed class maken, of die combineren met Move. Maar Move implements Runnable, dus daar kan je geen implements KeyListener bijdoen).
- Move is een class die de x en y positie van de cirkel van Draw verandert. Dit is een Thread class.

Als iemand enig advies heeft, graag!

(P.s., het is een full screen applicatie, met Esc kan deze afgesloten worden)

*Edit: als de cirkel buiten het scherm gaat, kan de applicatie vastlopen, tot nu toe geen idee hoe dat komt. Mijn excuses daarvoor!

**Edit: screenshots toegevoegd, animation.jpg is beginscherm, animation2.jpg als ik de cirkel een stuk naar beneden heb geschoven. Classes geupdate.
 

Bijlagen

  • animation.JPG
    animation.JPG
    22 KB · Weergaven: 37
  • animation2.JPG
    animation2.JPG
    22,5 KB · Weergaven: 39
  • Animation.zip
    Animation.zip
    5,1 KB · Weergaven: 16
Laatst bewerkt:
Ik heb je jar gerunned, maar de panel beweegt niet (ik neem ff snel aan dat je JPanel het blauwe vlak is).

Maar Move implements Runnable, dus daar kan je geen implements KeyListener bijdoen).

Dit kan wel:

Code:
public class Move implements Runnable, KeyListener{...}

Verder snap ik niet dat je in Main nog een JFrame aanmaakt, Main is zelf al een JFrame.
Sowieso, je zegt bij de instantievariabelen al dat window een JFrame is, en in de constructor doe je dit weer.

Het kan dus zo:
Code:
public Main()
    {
       // JFrame window = new JFrame(); --> Niet nodig
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] devices = environment.getScreenDevices();
        GraphicsDevice device = devices[0];

        draw = new Draw();
        add(draw);
        addKeyListener(draw);
        move = new Move(draw, this);
        thread = new Thread(move);
        thread.start();
        ...
}

je kunt alle [window. ...] vervangen door [this. ...] of zelfs heel [this.] weghalen ;)
 
Laatst bewerkt:
Ik heb je jar gerunned, maar de panel beweegt niet (ik neem ff snel aan dat je JPanel het blauwe vlak is).



Dit kan wel:

Code:
public class Move implements Runnable, KeyListener{...}

Verder snap ik niet dat je in Main nog een JFrame aanmaakt, Main is zelf al een JFrame.
Sowieso, je zegt bij de instantievariabelen al dat window een JFrame is, en in de constructor doe je dit weer.

Het kan dus zo:
Code:
public Main()
    {
       // JFrame window = new JFrame(); --> Niet nodig
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] devices = environment.getScreenDevices();
        GraphicsDevice device = devices[0];

        draw = new Draw();
        add(draw);
        addKeyListener(draw);
        move = new Move(draw, this);
        thread = new Thread(move);
        thread.start();
        ...
}

je kunt alle [window. ...] vervangen door [this. ...] of zelfs heel [this.] weghalen ;)

Panel is idd het blauwe vak. Vaag dat het niet beweegt... 0_o Misschien moet ik m'n JRE updaten of reïnstallen ofzo.

Ah, zo kan je dus dubbele implements doen, handig om te weten.

Ja, okay, logisch @ JFrame, had ik nog helemaal niet bij stilgestaan... Ik zal het aanpassen! Bedankt voor de tips. =) Ik beschouw 'm nog even niet als opgelost, aangezien ie bij mij nog beweegt. Ik post anders wel even wat screenshots als ik weer thuis ben.
 
@ Niek

Hmm, ik heb JRE en JDK opnieuw geïnstalleerd, nieuwste versie 6.12. Werkt nog steeds niet... Op andere PC geprobeerd, precies hetzelfde probleem. Met welke Windows versie werk jij? M'n laptop en PC zijn nl. XP, maar toen ik het net op de Vista-laptop van iemand anders probeerde werkte het gewoon goed. Heel apart...

*Edit: screenshots toegevoegd.
 
Laatst bewerkt:
Ik gebruik java 1.6.0_12 onder vista, ik zal het zo wel even onder xp proberen ;)

Screenshots zie ik overigens niet..

[edit] In XP krijg ik hetzelfde probleem.. De JPanel schuift ook mee, maar iets langzamer.. Geen idee waar dat aan ligt, zal er nog eens naar kijken! [/edit] ;)
 
Laatst bewerkt:
Ik gebruik java 1.6.0_12 onder vista, ik zal het zo wel even onder xp proberen ;)

Screenshots zie ik overigens niet..

[edit] In XP krijg ik hetzelfde probleem.. De JPanel schuift ook mee, maar iets langzamer.. Geen idee waar dat aan ligt, zal er nog eens naar kijken! [/edit] ;)

Inderdaad, het oaneel schuift mee op precies de helft van de snelheid. XP bug dus!

Ik kan er op internet verder niets over vinden tot nu toe... Ik ga wel proberen dit op een andere manier op te lossen, maar laat het gerust weten als je er nog wat over vindt! =) En bedankt voor het checken.
 
De fout zit in je Draw methode.. Je overschrijft hier getX & getY deze worden echter door Java gebruikt voor het plaatsen van je Panel.

Als je deze hernoemt naar bv. getXBal, getYBal dan werkt het al een stuk beter. :)

verwijder ook repaint() in je paintComponent().. Je hebt net je Panel getekend.. dus hoeft deze pas weer gerepaint te worden als de x,y coordinaten zijn gewijzigt...
In je move class doet je heel vaak main.add(Draw), dit hoeft je maar 1x een panel te doen. (in de Main class) daarna beweeg je de bal van jepanel. En hoeft je steeds weer panel toe te voegen aan je Frame.. Dus alle add(Draw) in Move kunnen weg.

succes
 
De fout zit in je Draw methode.. Je overschrijft hier getX & getY deze worden echter door Java gebruikt voor het plaatsen van je Panel.

Als je deze hernoemt naar bv. getXBal, getYBal dan werkt het al een stuk beter. :)

verwijder ook repaint() in je paintComponent().. Je hebt net je Panel getekend.. dus hoeft deze pas weer gerepaint te worden als de x,y coordinaten zijn gewijzigt...
In je move class doet je heel vaak main.add(Draw), dit hoeft je maar 1x een panel te doen. (in de Main class) daarna beweeg je de bal van jepanel. En hoeft je steeds weer panel toe te voegen aan je Frame.. Dus alle add(Draw) in Move kunnen weg.

succes
Aaaah, dat was 'm! Ik was iets te snel met te concluderen dat het een XP-bug was. Toch vreemd dat ie het in Vista anders weergaf, de Vista JRE pakt overrides kennelijk anders aan.

Dat met add(draw) was een beetje nutteloos inderdaad, ik dacht dat het daar misschien iets mee te maken had. In Move doe ik nu alleen een repaint van de area waarin de bal zich bevindt, scheelt weer onnodige repaint van het hele panel.

Heel erg bedankt! =D
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan