Trädvy Permalänk
Medlem
Plats
Blekinge
Registrerad
Maj 2008

Hjälp, javafråga..

Vad är det som gör att min "rect" blir typ "osynlig"?
Lägger jag drawRect direct i paintcomponent syns den som vanligt. Lägger jag den i draw som jag anropar i paintcomponent så finns den där, men syns ej/svagt blinkade eller flimrande.
Kan också vara någon annan del av koden som påverkar detta?

Här är koddelen:
public void paintComponent(Graphics g) {

draw();

}

public void draw() {
Graphics g = this.getGraphics();
g.setColor(new Color(255, 0, 0));
g.fillRect(xpos, ypos, 10, 10);
g.drawRect(xpos, ypos, 10, 10);

if (direction == 1) // kollar vilken riktning
{
ypos -= stepSize; // och flyttar rektangeln
} else if (direction == 2) {
xpos = xpos + stepSize;

} else if (direction == 3) {
ypos += stepSize;
}
else if (direction == 4) {
xpos -= stepSize;
}

repaint();

}

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

1) Använd rätt metodsignatur för paintComponent (obs "protected"):

protected void paintComponent(Graphics g)

2) Skicka med Graphics-argumentet till alla undermetoder som ska rita komponenten. Dessa undermetoder bör dessutom vara privata:

protected void paintComponent(Graphics g) { draw(g); } ... private void draw(Graphics g) { // rita med g }

3) Anropa inte repaint() från draw(). Eftersom repaint() anropar paint() som anropar paintComponent(), så kan du hamna i en evig loop.

Testa igen så.

Trädvy Permalänk
Medlem
Plats
Blekinge
Registrerad
Maj 2008

Funkade...men utan repaint, så händer det inget när jag trycker på piltangenterna. Och ett annat problem, nu blir det så att rektangeln följs av en "orm" eller hur man beskriver det. Jag vill att endast nuvarande rektangeln ska synas och inte de föregående positionerna av den.. Jag styr recten med piltangenterna.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

Anropa repaint där du registrerar tangentbordsnedtryckningen (du har någon KeyListener någonstans, förmodar jag?). Det är också där du ska manipulera komponentens position, INTE i den metod som ritar objektet. Heter metoden draw() så ska den rita, inget annat.

Hur ser resten av din kod ut? (Posta i code-taggar eller lägg upp på pastebin eller liknande)

Trädvy Permalänk
Medlem
Plats
Blekinge
Registrerad
Maj 2008

Jag har en gamepanel och en gameframe.

import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class GamePanel extends JPanel implements KeyListener { int xpos=10; int ypos=10; int direction; int stepSize = 1; public GamePanel() { this.setFocusable(true); this.addKeyListener(this); } protected void paintComponent(Graphics g) { draw(g); } private void draw(Graphics g) { g.setColor(new Color(255, 0, 0)); g.fillRect(xpos, ypos, 10, 10); if (direction == 1) // kollar vilken riktning { ypos -= stepSize; } else if (direction == 2) { xpos += stepSize; } else if (direction == 3) { ypos += stepSize; } else if (direction == 4) { xpos -= stepSize; } repaint(); } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) { System.out.println("TEST UPP"); direction = 1; } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { direction = 2; System.out.println("TEST HÖGER"); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { direction = 3; System.out.println("TEST NER"); } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { direction = 4; System.out.println("TEST VÄNSTER"); } } public void keyReleased(KeyEvent e) { } }

import javax.swing.JFrame; public class GameFrame extends JFrame{ public GameFrame(String title) { super(title); setSize(600,600); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); init(); } /**Initializes the frame*/ public void init() { GamePanel game = new GamePanel(); add(game); } }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

Jag har en lösning på dina problem (för de är flera! ), men det är mycket att skriva och förklara, så jag får be att återkomma om det imorgon, om ingen annan hinner före.