Permalänk
Medlem

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();

}

Permalänk
Medlem

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å.

Permalänk
Medlem

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.

Permalänk
Medlem

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)

Permalänk
Medlem

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); } }

Permalänk
Medlem

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.