Metoda se zavolá sama od sebe. – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Metoda se zavolá sama od sebe. – Java – Fórum – Programujte.comMetoda se zavolá sama od sebe. – Java – Fórum – Programujte.com

 

martin
~ Anonymní uživatel
1600 příspěvků
10. 10. 2012   #1
-
0
-

Jak je možné že se metoda paint(Graphics g) zavolá sama?

KÓD:

package hra;

import java.awt.Graphics;

import javax.swing.JFrame;

public class grafika extends JFrame {

  public static void main(String[] a){
    grafika f = new grafika();
    f.setSize(300,300);
    f.setVisible(true);
  }
 
 
  public void paint(Graphics g) {
    g.fillRect(100, 100, 60, 50);
  }
}

Nahlásit jako SPAM
IP: 194.12.32.–
KIIV
~ Moderátor
+43
God of flame
10. 10. 2012   #2
-
0
-

tomu se rika callback---  a nevola se sama... okenni aplikace toho dela mnohem vic nez tusis

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
zlz
~ Anonymní uživatel
634 příspěvků
10. 10. 2012   #3
-
0
-

Nezavolá se sama. Zavolá ji "grafický systém", když chce, aby se komponenta vykreslila.

Když si do paint přidáš třeba toto

new Throwable().printStackTrace();

tak uvidíš odkud se to volá.

Nahlásit jako SPAM
IP: 80.188.216.–
martin
~ Anonymní uživatel
1600 příspěvků
10. 10. 2012   #4
-
0
-

Díky už goglím ten "Grafický systém ".

Nahlásit jako SPAM
IP: 194.12.32.–
zlz
~ Anonymní uživatel
634 příspěvků
10. 10. 2012   #5
-
0
-

Tím jsem myslel obecně to, co se stará o to, aby se všechno vykreslovalo. Není to konkrétní pojem, takže vygooglíš prdlačky.

Nahlásit jako SPAM
IP: 80.188.216.–
martin
~ Anonymní uživatel
1600 příspěvků
11. 10. 2012   #6
-
0
-

Další záludnost co kdybych chtěl metodu paint() překreslit něco jako repaint()? Já totiž hodlám s tím čtvercem pohybovat. Místo argumetu 100 dosadím osaX, osaY a budu jim měnit hodnotu a poté bych potřeboval čtverec zaktualizovat.

Nahlásit jako SPAM
IP: 194.12.32.–
sleepy0
Stálý člen
11. 10. 2012   #7
-
0
-

na to existuje metoda update(Gaphics g) staci ju overridnut. a do paintu uz len napisat paint(Graphics g){update(g);}

Nahlásit jako SPAM
IP: 158.195.195.–
sleepy0
Stálý člen
11. 10. 2012   #8
-
0
-

A ak nastane nejaka udalot. tak zavolas len repaint().

Nahlásit jako SPAM
IP: 158.195.195.–
martin
~ Anonymní uživatel
1600 příspěvků
11. 10. 2012   #9
-
0
-

Takto? To mi hlásí že to nezná Graphics g.  Metodu repaint() znám ale to bych musel metodu paint() dát do odlišné třídy nebo ne? 

import java.awt.Graphics;
import javax.swing.JFrame;

public class grafika extends JFrame {
  public static void main(String[] a){
    grafika f = new grafika();
    f.setSize(300,300);
    f.setVisible(true);
  }


  public void paint(Graphics g) {
{update(g);}
    g.fillRect(100, 100, 60, 50);
  }
  @Override
  public void update(Gaphics g){
  
  }
}
Nahlásit jako SPAM
IP: 194.12.32.–
sleepy0
Stálý člen
11. 10. 2012   #10
-
0
-

Nie takto:

import java.awt.Graphics;
import javax.swing.JFrame;

public class grafika extends JFrame {
	public static void main(String[] a){
		grafika f = new grafika();
		f.setSize(300,300);
		f.setVisible(true);
	}


	public void paint(Graphics g) {
		update(g);
	}

	@Override
	public void update(Gaphics g){
  		g.fillRect(100, 100, 60, 50);
	}
}
Nahlásit jako SPAM
IP: 158.195.195.–
martin
~ Anonymní uživatel
1600 příspěvků
11. 10. 2012   #11
-
0
-

Už mi to funguje. Mimochodem šlo by v tomto případě používat metodu repaint() a jak? Já ji používal ale ve spojitosti s třídou a ne metodou. 

Nahlásit jako SPAM
IP: 194.12.32.–
sleepy0
Stálý člen
11. 10. 2012   #12
-
0
-

No teraz ak zavolas repaint() tak sa spusti okrem ineho kod v update. Cize ak implementnes nejaky Listner, napriklad MouseListener, tak do nejakych pozicie ti moze nakreslit stvorec, alebo nieco ine. Alebo mozes urobit animaciu ako iny thread ze:
 

public class Grafika extends JFrame implements Runnable {
	int x = 0,y = 100 ,w = 25,h = 25;
	public static void main(String[] a){
		grafika f = new grafika();
	}

	public Grafika(){
		super("Animacia");
		setSize(300,300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}


	public void paint(Graphics g) {
		update(g);
	}

	@Override
	public void update(Gaphics g){
		g.setColor(Color.black);
		g.fillRect(0, 0, 300, 300);
		g.setColor(Color.white);
  		g.fillRect(this.x, this.y, this.w, this.h);
		new Thread(this).start();
	}
	/**
	* Posunie stvorec do polohy x,y a prekresli.
	*/
	public void moveRect(int x, int y){
		this.x = x;
		this.y = y;
		repaint();
	}

	public void run(){
		for(int i=0; i<100; i++){
			moveRect((i*30)%300, 100);
			try{
				Thread.sleep(300);// Vlakno sa uspi na 300 ms
			}
			catch(InterruptedException ie){
				break;
			}
		}
	}
	
}
Nahlásit jako SPAM
IP: 158.195.195.–
martin
~ Anonymní uživatel
1600 příspěvků
11. 10. 2012   #13
-
0
-

Neví někdo o nějakém tutoriálu nebo článku, který pojednává o tzv. "Grafickém systému".

Nahlásit jako SPAM
IP: 194.12.32.–
martin
~ Anonymní uživatel
1600 příspěvků
11. 10. 2012   #14
-
0
-

Když jsem spustil program Sleepyho tak se ten čtverec posouval trhavě nevíte proč? Někde jsem četl že to může být způsobeno jednojádrovím procesorem ale já mám dvoujádro.

Nahlásit jako SPAM
IP: 194.12.32.–
sleepy0
Stálý člen
11. 10. 2012   #15
-
0
-

No lebo tam mas sleep na 300 ms medzi jednotlivimi prekresleniami. nastam si for od 0 do 1000 a daj si 30 ms a bude to plynulejsie. Ak chces nieco taketo riesit tak potom si precitaj nieco aj od doublebufferingu, Shape-och, Graphics2D a pod. http://docs.oracle.com/javase/tutorial/2d/index.html

Nahlásit jako SPAM
IP: 158.195.195.–
sleepy0
Stálý člen
11. 10. 2012   #16
-
0
-

A nastav si posuv na mensi: moveRect((i*3)%300). Jednoducho pohraj sa s tym

Nahlásit jako SPAM
IP: 158.195.195.–
zlz
~ Anonymní uživatel
634 příspěvků
11. 10. 2012   #17
-
0
-

#13 martin
Neřeš grafický systém a prostě se podívej do dokumentace k čemu je paint/update/repaint/...

Nahlásit jako SPAM
IP: 78.156.159.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

Niekto zavola na pevnu a net padne — založil ps2console

Myš sa sama hýbe — založil lukas.balaz

Fotky vedle sebe — založil Onsi

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý