Niedziałający mouselistener w aplecie Java

0

Witam, mam za zadanie napisać aplet, który narysuje pewien rysunek a następnie po kliknięciu w obszar wykona akcję. (na rysunku jest mi. człowiek, który kiedy kliknie się mu na głowę ma sprawić, że przybiegnie do niego pies i słońce zacznie się przesuwać.

Poniżej zamieszczam kod, który udało mi się napisać, ale tego kliknięcia nie mogę za nic zrobić:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;


public class klasa extends Applet implements MouseListener
{

	int x,y;
	
	public void init()
	{	
		addMouseListener(this);
	}
	
public void paint(Graphics g)
{
	Color fioletowy = new Color(150,0,100);
	Color szary = new Color(190,190,190);
	boolean promien = true;
	Image pies = getImage(getDocumentBase(),"pies.gif");
	Image drzewom = getImage(getDocumentBase(),"drzewom.jpg");
	Image drzewod = getImage(getDocumentBase(),"drzewod.jpg");
	
// niebo
	g.setColor(new Color(0,128,255));
	g.fillRect(0,0,1000,315);
//trawa
	g.setColor(new Color(28,80,0));
	g.fillRect(0,315,1000,285);
//droga
	int tabdrx[] = {480,555,685,295,480};
	int tabdry[] = {315,315,600,600,315};
	
	g.setColor(new Color(90,90,90));		
	g.fillPolygon(tabdrx,tabdry,(tabdrx.length)-1);

//czlowiek
	g.setColor(Color.black);
	g.fillOval(511,334,14,14);
	g.drawLine(518,345,518,373);
	g.drawLine(518,353,527,362);
	g.drawLine(518,353,510,362);
	g.drawLine(518,373,527,384);
	g.drawLine(518,373,510,384);

//drzewa
	int tabdx[] = {625,650,635,650,635,650,600,615,600,615,600,625};
	int tabdy[] = {290,325,325,350,350,375,375,350,350,325,325,290};
	
	g.setColor(new Color(54,151,1));		
	g.fillPolygon(tabdx,tabdy,(tabdx.length)-1);
	g.setColor(new Color(128,64,0));
	g.fillRect(620,375,14,10);
		
	g.drawImage(drzewom,650,390,this);
	g.drawImage(drzewod,785,430,this);
	
	for(int i=0; i<600; i+=5)
	{

//blok
	g.setColor(szary);
	g.fillRect(145,145,170,325);
	
	int tabbx[] = {187,353,353,315,315,145,187};
	int tabby[] = {99,99,423,469,145,145,99};
	
	g.setColor(new Color(117,117,117));		
	g.fillPolygon(tabbx,tabby,(tabbx.length)-1);
	
//drzwi
	g.setColor(fioletowy);
	g.fillRect(205,395,50,75);
	
//okna
	g.setColor(new Color(3,171,161));
	g.fillRect(165,165,55,100);
	g.fillRect(240,165,55,100);
	g.fillRect(165,280,55,100);
	g.fillRect(240,280,55,100);
	
//slonce
	g.setColor(new Color(255,255-(i/3),0));
	g.fillOval(817-i,46+(i/4),40,40);
	try
	{
	Thread.sleep(100);
	}
	catch(InterruptedException e)
	{}
	if(promien == true)
	{
//promien1
	g.drawLine(839-i,7+(i/4),839-i,36+(i/4));
	g.drawLine(868-i,68+(i/4),897-i,68+(i/4));
	g.drawLine(839-i,98+(i/4),839-i,127+(i/4));
	g.drawLine(778-i,68+(i/4),807-i,68+(i/4));
	promien = false;
	} else {	
//promien2
	g.drawLine(839-i,7+(i/4),839-i,26+(i/4));
	g.drawLine(878-i,68+(i/4),897-i,68+(i/4));
	g.drawLine(839-i,108+(i/4),839-i,127+(i/4));
	g.drawLine(778-i,68+(i/4),797-i,68+(i/4));
	promien = true;
	}
	try
	{
	Thread.sleep(100);
	}
	catch(InterruptedException e)
	{}
	g.setColor(new Color(0,128,255));
	g.fillOval(817-i,46+(i/4),40,40);
	g.drawLine(839-i,7+(i/4),839-i,36+(i/4));
	g.drawLine(868-i,68+(i/4),897-i,68+(i/4));
	g.drawLine(839-i,98+(i/4),839-i,127+(i/4));
	g.drawLine(778-i,68+(i/4),807-i,68+(i/4));
	
//pies
	g.setColor(new Color(90,90,90));
	g.fillRect(501,502-(i/5),47,85);	
	g.drawImage(pies,503,504-(i/5),this);
	}
}


public void mouseClicked(MouseEvent e)
	{
		x = e.getX();
		y = e.getY();
		if(x>511 && x<525 && y>324 && y<338)
		{
			repaint();
		}
	}
	public void mousePressed(MouseEvent e)
	{}
	public void mouseReleased(MouseEvent e)
	{}
	public void mouseEntered(MouseEvent e)
	{}
	public void mouseExited(MouseEvent e)
	{}
}

Jeśli ktoś mógłby poprawić ten kod, ewentualnie wyjaśnić jak to zrobić byłbym wdzięczny :)

0
  1. Nie piszemy klas "człowiek orkiestra". Jak coś jest appletem to NIE jest mouseListenerem
  2. Robimy małe metody o sensowych nazwach. Nie mogłeś tych bloków z paint() wrzucić w osobne metody zamiast pisać komentarzy?
  3. Nie napisałeś CO nie działa.
0

Ja bym zrobił tak:
Słońce jest malowane w punkcie (x,y) x,y to pola w klasie.
Kliknięcie w obszar apletu inicjuje timer, timer co pewien czas zmienia x oraz y i wywołuje repaint(). Żadnych usypiań (Thread.sleep()) i żadnych pętli w metodzie paint().

0

Dobra poradziłem sobie sam w końcu :)

Mam jeszcze jeden problem jednak, chodzi o to, co mam zrobić, aby słońce, które ma zachodzić za blok było rysowane za nim a nie przed.

Dla jasności załączam aktualny kod:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class klasa extends Applet implements MouseListener 
{

Point p;

public void init()
{
addMouseListener(this);
}

public void paint(Graphics g)
{
	Color fioletowy = new Color(150,0,100);
	Color szary = new Color(190,190,190);
	boolean promien = true;
	Image drzewom = getImage(getDocumentBase(),"drzewom.jpg");
	Image drzewod = getImage(getDocumentBase(),"drzewod.jpg");
	Image pies = getImage(getDocumentBase(),"pies.gif");

//niebo
	g.setColor(new Color(0,128,255));
	g.fillRect(0,0,1000,315);
	
//trawa
	g.setColor(new Color(28,80,0));
	g.fillRect(0,315,1000,285);
	
//droga
	int tabdrx[] = {480,555,685,295,480};
	int tabdry[] = {315,315,600,600,315};
	
	g.setColor(new Color(90,90,90));		
	g.fillPolygon(tabdrx,tabdry,(tabdrx.length)-1);
	
//czlowiek
	g.setColor(Color.black);
	g.fillOval(511,334,14,14);
	g.drawLine(518,345,518,373);
	g.drawLine(518,353,527,362);
	g.drawLine(518,353,510,362);
	g.drawLine(518,373,527,384);
	g.drawLine(518,373,510,384);

//drzewa
	int tabdx[] = {625,650,635,650,635,650,600,615,600,615,600,625};
	int tabdy[] = {290,325,325,350,350,375,375,350,350,325,325,290};
	
	g.setColor(new Color(54,151,1));		
	g.fillPolygon(tabdx,tabdy,(tabdx.length)-1);
	g.setColor(new Color(128,64,0));
	g.fillRect(620,375,14,10);
		
	g.drawImage(drzewom,650,390,this);
	g.drawImage(drzewod,785,430,this);
	
//blok
	g.setColor(szary);
	g.fillRect(145,145,170,325);
	
	int tabbx[] = {187,353,353,315,315,145,187};
	int tabby[] = {99,99,423,469,145,145,99};
	
	g.setColor(new Color(117,117,117));		
	g.fillPolygon(tabbx,tabby,(tabbx.length)-1);
	
//drzwi
	g.setColor(fioletowy);
	g.fillRect(205,395,50,75);
	
//okna
	g.setColor(new Color(3,171,161));
	g.fillRect(165,165,55,100);
	g.fillRect(240,165,55,100);
	g.fillRect(165,280,55,100);
	g.fillRect(240,280,55,100);
	
//slonce
	g.setColor(new Color(255,255,0));
	g.fillOval(817,46,40,40);
	g.drawLine(839,7,839,36);
	g.drawLine(868,68,897,68);
	g.drawLine(839,98,839,127);
	g.drawLine(778,68,807,68);
	
//pies
	g.setColor(new Color(90,90,90));
	g.fillRect(501,502,47,85);	
	g.drawImage(pies,503,504,this);
	
//napis
	g.setColor(Color.black);
	g.drawString("Kliknij mi na głowę",450,300);

	for(int i=0;i<600;i=i+5)
	{
		//slonce
		g.setColor(new Color(0,128,255));
		g.fillRect(773-i,5+(i/4),130,130);

		g.setColor(new Color(255,255-(i/3),0));
		g.fillOval(817-i,46+(i/4),40,40);

		if(promien == true)
		{
		//promien1
		g.drawLine(839-i,7+(i/4),839-i,36+(i/4));
		g.drawLine(868-i,68+(i/4),897-i,68+(i/4));
		g.drawLine(839-i,98+(i/4),839-i,127+(i/4));
		g.drawLine(778-i,68+(i/4),807-i,68+(i/4));
		promien = false;
		} else {	
		//promien2
		g.drawLine(839-i,7+(i/4),839-i,26+(i/4));
		g.drawLine(878-i,68+(i/4),897-i,68+(i/4));
		g.drawLine(839-i,108+(i/4),839-i,127+(i/4));
		g.drawLine(778-i,68+(i/4),797-i,68+(i/4));
		promien = true;
		}
		
		try
		{
			Thread.sleep(200);
		}
		catch(InterruptedException e)
		{}
		
	if(p.x>511 && p.x<525 && p.y>334 && p.y<348)
	{
	//pies
	g.setColor(new Color(90,90,90));
	g.fillRect(501,502-(i/5),47,85);	
	g.drawImage(pies,503,504-(i/5),this);
	}
	try
	{
	Thread.sleep(100);
	}
	catch(InterruptedException e)
	{}
}
}

public void mouseClicked(MouseEvent e)
{
	p=e.getPoint();
	if(p.x>511 && p.x<525 && p.y>334 && p.y<348)
	repaint();
}

public void mouseEntered(MouseEvent e)
{}

public void mouseExited(MouseEvent e)
{}

public void mousePressed(MouseEvent e)
{}

public void mouseReleased(MouseEvent e)
{}
}
0

Ty poważnie pytasz? Zmień kolejność rysowania, wpierw słońce, potem blok.

0

dobra to było głupie pytanie xD temat do usunięcia :P dzięki za pomoc :P

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.