webForumDet fria alternativet

paint(Graphics g) och Keyadapter

4 svar · 238 visningar · startad av nill

nillMedlem sedan okt. 2001387 inlägg
#1

Nybörjare på java men har tagit åt mig uppgiften att kunna styra en bil (röd rektangel) på en väg.
Grafiken får jag att fungera samt att lyssna på tangentbordet. Men hur jag kombinerar de två går utöver mina kunskaper. Här är koden jag jobbar med:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
//import java.util.*;

class Uppg8x extends Frame
{

private Graphics g;

public Uppg8x() {
//Fönsterinställningar
setBounds(50,50, 300, 400);
setBackground(Color.blue);

myKeyListener keyHandler = new myKeyListener(this);
this.addKeyListener(keyHandler);

}

public void paint(Graphics g) {

g.setColor(Color.red);
g.drawString("100px", 100, 100);
g.setColor(Color.yellow);
g.fillOval(-10,-10,100,100);
g.drawLine(20,50,35,120);
g.drawLine(0,0,100,100);
g.drawLine(20,20,115,70);
g.setColor(Color.green);
g.fillRect(0,220,300, 180);
g.fillOval(175, 130, 70, 70);
g.setColor(Color.yellow);
g.fillRect(200,200,20, 50);
g.setColor(Color.black);
g.fillRect(50,180,120, 80);
g.setColor(Color.white);
g.fillRect(80,220,10, 10);
g.fillRect(140,220,10, 10);
g.setColor(Color.black);
g.fillRect(0,280,300,100);
for (int i = 0;i < 100;i = i + 20)
ritaBil(g, i, 0);

}
public void ritaBil(Graphics g, int x, int y){
g.setColor(Color.red);
g.fillRect(200-x,300-y, 50, 30);
}

public void rita(){
paint(g);
}

//public void ritaBil(){
// System.out.println("hej");
//}

public static void main (String[] args)throws IOException
{
Uppg8x frame = new Uppg8x();
frame.setBounds(50,50, 300, 400);
frame.setVisible(true);
}

}
class myKeyListener extends KeyAdapter{
  Uppg8x thisObject;

  myKeyListener(Uppg8x thisObjectIn){//constructor
    thisObject = thisObjectIn;
  }//end constructor

public void keyPressed(KeyEvent e){

System.out.println("Tangent: " +e.getKeyChar());
thisObject.rita();

}

}
PeWMedlem sedan juni 200010 432 inlägg
#2

Genom myKeyListener kan du avläsa vilka tangenter som trycks ned och därmed lägga in lite kod för att ändra x och y.

if(e.getKeyCode() == KeyEvent.VK_Z) { setY(_less_); }
if(e.getKeyCode() == KeyEvent.VK_M) { setY(_more_); }

... osv
nillMedlem sedan okt. 2001387 inlägg
#3

ja jo det förstår jag. Men jag förstår inte hur jag kan få grafiken att rita om sig: paint-metoden anropas ju aldrig. Den bara utförs när programmet startas. Hur ska jag då kunna ändra något i den andra klassen. Jag måste ju anropa metoden på något sätt. Men den ska ju inte anropas?

PeWMedlem sedan juni 200010 432 inlägg
#4

Du bör ärva ned lite tråd-funktionalitet från Runnable och låta metoden Run arbeta :)

Ex: http://java.sun.com/docs/books/tutorial/essential/threads/clock.html

psMedlem sedan juni 2000841 inlägg
#5

Låt säga att metoden setX(MOVE_LEFT) körs, då ändrar du några värden för bilen som gör att den nästa gång den ritas upp har flyttat sig några pixlar till vänster. För att uppdateringen sen ska synas så kör du repaint() sist i metoden setX(MOVE_LEFT) så uppdateras hela kitet (dvs det som du har i metoden paint(Graphics g) körs)

127 ms totalt · 3 externa anrop · v20260731065814-full.b943c234
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)