Aplet painta - problem z niestatycznymi metodami

0

Witam

Kiedyś tam dawno temu liznąłem Javę, ale to w minimalnym stopniu. Teraz chciałem do niej wrócić i postanowiłem zacząć od prostego apletu, w którym można będzie rysować. Może nie najprościej, ale tak to sobie wymyśliłem:

import java.awt.*;
import java.applet.*;
import javax.swing.JApplet;
import java.awt.event.*;

class punkt
	{
		int x;
		int y;
		punkt()
			{
				x=800;
				y=800;
			}
	}
	
public class MyApp extends JApplet implements MouseMotionListener, MouseListener
{
	int r=10;
	Button wybor_grubosci = new Button("Grubosc 20"), wybor_grubosci2 = new Button("Grubosc 5"), 
	czysc = new Button("Czysc");
	String tekst = "";
	punkt srodek = new punkt();
	
	public void init()
	{
		addMouseMotionListener(this);
		addMouseListener(this);
		setLayout(null);
		
		wybor_grubosci.setBounds(390,480,90,20);
		wybor_grubosci2.setBounds(390,450,90,20);
		czysc.setBounds(390,30,90,20);
		wybor_grubosci.addActionListener(new B1());
		wybor_grubosci2.addActionListener(new B2());
		czysc.addActionListener(new B3());
		add (wybor_grubosci);
		add (wybor_grubosci2);
		add (czysc);	
	}
	
	class B1 implements ActionListener
   {
   public void actionPerformed(ActionEvent e)
		{   
			r=20;
		}
   }   
   class B2 implements ActionListener
   {
   public void actionPerformed(ActionEvent e)
		{   
			r=5;
		}
   }  
   class B3 implements ActionListener
      {
	   public void actionPerformed(ActionEvent e)
   	{
	   	Graphics.clearRect(0,0,500,500);
	  	}
   }


	public void mouseDragged(MouseEvent evt) 
		{
				srodek.x=evt.getX()-r/2;
				srodek.y=evt.getY()-r/2;
				int przycisk = evt.getButton();
				switch(przycisk)
					{
					case MouseEvent.BUTTON1: Graphics.fillOval(srodek.x,srodek.y,r,r); break;				
					}
				repaint();
		}	
	public void mouseMoved(MouseEvent evt) 
		{
				tekst = "Wspolrzedne: x=" + evt.getX() + ", y=" + evt.getY();
				repaint();
		}
	public void mouseClicked(MouseEvent evt) 
		{				
				srodek.x=evt.getX()-r/2;
				srodek.y=evt.getY()-r/2;
				int przycisk = evt.getButton();
				switch(przycisk)
					{
					case MouseEvent.BUTTON1: Graphics.fillOval(srodek.x,srodek.y,r,r); break;
					}
		}
	public void mouseExited(MouseEvent evt) {}
	public void mouseEntered(MouseEvent evt) {}
	public void mouseReleased(MouseEvent evt) {}
	public void mousePressed(MouseEvent evt) {}
	

	public void paint(Graphics g)
	{
		g.clearRect(15,10,155,15);	
		g.drawString(tekst,20,20);	 
	}
}	

Błędy kompilacji, które otrzymuję:

C:\Users\Krzychu\Desktop\java\MyApp.java:60: non-static method clearRect(int,int,int,int) cannot be referenced from a static context
	   	Graphics.clearRect(0,0,500,500);
	   	        ^
C:\Users\Krzychu\Desktop\java\MyApp.java:72: non-static method fillOval(int,int,int,int) cannot be referenced from a static context
					case MouseEvent.BUTTON1: Graphics.fillOval(srodek.x,srodek.y,r,r); break;				
					                                 ^
C:\Users\Krzychu\Desktop\java\MyApp.java:88: non-static method fillOval(int,int,int,int) cannot be referenced from a static context
					case MouseEvent.BUTTON1: Graphics.fillOval(srodek.x,srodek.y,r,r); break;
					                                 ^
3 errors
Exit code: 1
There were errors

Wiem, że mógłbym to rozwiązać używając repainta, ale nie jest mi to zbyt na rękę z pewnych powodów. Zamierzam później dodać jeszcze inne komponenty i nie wiem, czy będzie to najlepszy pomysł.

Proszę o pomoc i pozdrawiam :D

0

To nie są statyczne metody, więc musisz mieć instancję klasy, aby je wywołać. Nie bez powodu metoda paint otrzymuje obiekt Graphics :) Prawdopodobnie musisz używać repainta i jakichś flag, co masz rysować. Ewentualnie mógłbyś sobie zapisać Graphics, który otrzymujesz w metodzie paint, ale nie wiem, czy to przejdzie.

0

Zapamiętanie obiektu g zapewne przejdzie, ale rysowanie poza metodą paint() ma poważną wadę - rysunek nie zostanie należycie odświeżony po zasłonięciu apletu innym programem (inną stroną w przeglądarce) i ponownym odsłonięciu.

0

Powinieneś przyjąć inną koncepcję działania. To co przekazujesz za pomocą myszy i klawiatury (np. współrzędne, znaki, rodzaje kliknięć lub wleczeń) traktuj jako dane potrzebne do odrysowywania obrazka. Poszczególne rodzaje obiektów takie jak elipsy, odcinki, teksty i ich umiejscowienie itp. możesz zachowywać w dynamicznej tablicy, a podczas działania paint() zwyczajnie wykorzystać je do odrysowywania całego obrazka.
Przy odświeżaniu obrazu i tak rysowany jest tylko obszar zaznaczony do odrysowania, więc wszystkie operacje działające na punktach poza takim obszarem stają się z punktu widzenia AWT i Swinga operacjami pustymi (niby je wykonujesz, a faktycznie nic nie robią na pamięci bufora obrazu). Nie traktuj też pamięci obrazu jako coś niezmiennego - tak naprawdę nie masz nad nią żadnej kontroli. Z Twojego punktu widzenia nie jest ona danymi programu bo w każdej chwili może być nawet w całości skasowana przez system lub dowolną inna aplikację. To co wyrysowujesz powinieneś traktować jako wysyłkę tylko do zapisu bez możliwości odczytu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1