Gå til innhold

sliter med en mouselistener.


Anbefalte innlegg

Jeg har et ganske enkelt ønske om at det skal dukke opp et lite bilde på JPanelet mitt når jeg trykker på det. Jeg har forsøkt som dette:

 

Det jeg sliter med er selve lytteren. Jeg har prøvd dette:

lage en JFrame

feste JPanel på JFrame

panel.addMouseListener(new MouseListener());

 

også har jeg laget en klasse som ser slik ut:

 

public class MouseListener extends MouseAdapter{

public void MouseClicked(MouseEvent e){

towers.add(new Tower(e.getXOnScreen(), e.getYOnScreen(), 300));

}

}

 

Akkurat hva som står inni MouseClicked trenger dere ikke forstå, problemet er at den aldri går gjennom den uansett hvor mye jeg trykker. Hjelp? :p

Lenke til kommentar
Videoannonse
Annonse

godt poeng faktisk, men får det fortsatt ikke til å funke :p

 

public Rammeverk(){

 

 

ramme = new JFrame();

ramme.setBounds(0,0,WIDTH, HEIGHT);

 

panel = (JPanel)ramme.getContentPane();

panel.add(this);

ramme.addMouseListener(new MouseListener());

 

ramme.setResizable(false);

ramme.setVisible(true);

 

 

}

 

public class MouseListener extends MouseAdapter{

 

 

public void mouseClicked(MouseEvent e){

towers.add(new Tower(e.getXOnScreen(), e.getYOnScreen(), 300));

System.out.println("lol");

}

 

ramme er en JFrame, panel er en JPanel. Skjer jo endel andre ting også da, men dette bør være det eneste som er relevant.

Lenke til kommentar

Det er tydelig at jeg ikke har forstått hvor panel legger seg og sånn, men nå har jeg prøvd alt av ting dere har foreslått og brukt koden som pgdx ga meg, og det funker fortsatt ikke, så nå bare limer jeg inn koden.

 

Hvis noen hadde giddet å se på paint metoden og se om det er noe der som krasjer med mouselistener eller noe hadde jeg blitt glad. Det var nemlig sånn for en stund siden at jeg kunne klare å få mouselisteneren til å funke, men da ville den ikke tegne, og det er også sånn at hvis jeg bytter ut den "getContentPane()" greia på staretn med en "new JPanel()" så får jeg en feilmelding i paintmetoden på "offscreen.getGraphics()".

 

Det er forresten bare å ignorere metoder som utIverden, newWave osv, det meste av det som printes ut er bare ord som viser meg at nå går den gjennom det skrittet sånn at jeg vet at det funker. Det som refererer til tower og creep fungerer også, det har gått fint uten mouseListeneren. Setter utrolig stor pris på all hjelp!

package towerD2;

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

import javax.swing.*;

public class Rammeverk extends Canvas{

ArrayList<Creep> creeps = new ArrayList<Creep>();
ArrayList<Creep> aktiveCreeps = new ArrayList<Creep>();
ArrayList<Tower> towers = new ArrayList<Tower>();

JFrame ramme;
JPanel panel;
Image offscreen;

int creepspawnX = 122;
int creepspawnY = 308;
int speedX = 2;
int speedY = 0;
int creepHP = 800;
int antallCreeps = 9;


public static final int WIDTH = 800;
public static final int HEIGHT = 600;
int FPS = 60;


int lagCounter;
long tidMellomWaves;

public Rammeverk(){


	ramme  = new JFrame();

	panel = (JPanel)ramme.getContentPane();


	ramme.setBounds(0,0,WIDTH, HEIGHT);
	ramme.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


	panel.addMouseListener(new MouseAdapter() {
		public void mouseClicked(MouseEvent e){
			towers.add(new Tower(e.getXOnScreen(), e.getYOnScreen(), 300));
			System.out.println(e);
		}
	});

	panel.add(this);


	ramme.setResizable(false);
	ramme.setVisible(true);



	}


public void paint(Graphics g){

	if(offscreen==null)
		offscreen = createImage(WIDTH, HEIGHT);

	Graphics og = offscreen.getGraphics();
	og.setColor(this.getBackground());
	og.setClip(0,0,getSize().width, getSize().height);
	og.fillRect(0, 0, WIDTH, HEIGHT);
	for(int i=0; i<aktiveCreeps.size(); i++)
		og.drawImage(aktiveCreeps.get(i).getImg(),aktiveCreeps.get(i).getX(), aktiveCreeps.get(i).getY(), null);
	for(int i=0; i<towers.size(); i++)
		og.drawImage(towers.get(i).getBilde(), towers.get(i).getX(), towers.get(i).getY(), null);
	g.drawImage(offscreen, 0, 0, null);
}


public void update(){
	for(int i=0; i<aktiveCreeps.size(); i++){
		aktiveCreeps.get(i).move();
	}
	if(!creeps.isEmpty()&&lagCounter == FPS){	
		utIVerden();
		lagCounter = 0;
	}
	if(lagCounter>FPS)
		lagCounter = 0;
	lagCounter++;
}

public void utIVerden(){
	System.out.println("nytt creep til verden");
	creeps.get(0).setAktiv(true);
	aktiveCreeps.add(creeps.get(0));
	creeps.remove(0);

}

public void game(){
	lagCounter = 0;
	newWave();
	long beginTime = System.currentTimeMillis();

	while(isVisible()){
		while(System.currentTimeMillis()-beginTime > 1000/FPS){
			beginTime = System.currentTimeMillis();
			update();
			paint(getGraphics());
		}
	}
}

public void newWave(){
	System.out.println("lage ny wave" + creeps.size () + " " + aktiveCreeps.size());
	tidMellomWaves = System.currentTimeMillis();
		for(int i=0; i<antallCreeps; i++){
			creeps.add(new Creep(creepspawnX,creepspawnY, speedX, speedY, creepHP));
		}
	}

public static void main(String[] args){
	Rammeverk rammeverk = new Rammeverk();
	rammeverk.game();
}
}

Lenke til kommentar

Prøv å bytte ut konstuktøren din med denne:

 

public Rammeverk() {
	ramme = new JFrame();
	panel = new JPanel();

	ramme.setBounds(0, 0, WIDTH, HEIGHT);
	ramme.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	panel.add(this);
	ramme.add(panel);
	ramme.setResizable(false);
	ramme.setVisible(true);

	panel.addMouseListener(new MouseAdapter() {
		public void mouseClicked(MouseEvent e) {
			towers.add(new Tower(e.getXOnScreen(), e.getYOnScreen(), 300));
			System.out.println(e);
		}
	});
}

Lenke til kommentar

Der funket mouseListener ja, men nå tegner den ingenting ;p

 

Men nå kjørte jeg debug og så gjennom alt, og den går innom "paint", painter først "og" også over på "g", men jeg ser det ikke. Kan det være at det males på et lag som jeg ikke lenger ser siden mouseListener ligger over den? Noe sånt?

Lenke til kommentar
Der funket mouseListener ja, men nå tegner den ingenting ;p

 

Men nå kjørte jeg debug og så gjennom alt, og den går innom "paint", painter først "og" også over på "g", men jeg ser det ikke. Kan det være at det males på et lag som jeg ikke lenger ser siden mouseListener ligger over den? Noe sånt?

Nå tror jeg det er på tide at du leser en av Sun sine guider. http://java.sun.com/docs/books/tutorial/uiswing/index.html

 

Men, nei, det er ikke fordi mouseListeneren ligger oppå.

Lenke til kommentar
Der funket mouseListener ja, men nå tegner den ingenting ;p

Etter konstruktøren har visst canvas (this) størrelse (0,0). For liten plass å tegne noe på. ;p

 

 

this.setBounds(0, 0, WIDTH, HEIGHT);

Med forbehold om at jeg selvsagt ikke har fungerende Creep- og Tower-klasser å teste med. Og ikke har grublet over evt. mer hensiktsmessige løsninger.

 

 

Lenke til kommentar

Er nok på tide jeg tar en liten tutorial i gui ja :)

 

cyberfrog: Løsningen din gjorde at den igjen kunne tegne, men den godkjente bare musetrykk som hadde y-verdi under 30 fra toppmargen..Merkelige saker

 

Fant en løsning allikevel da, fjernet bare "ramme." foran mouseListener og ersattet med "this.", så funket det perfekt. Skjønner ikke hvorfor det måtte være sånn, men det er vel derfor jeg må ta en tutorial. Tusen takk for hjelp alle sammen ;)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...