Zaseknutí při přesunu objektu pomocí sleep() – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zaseknutí při přesunu objektu pomocí sleep() – Java – Fórum – Programujte.comZaseknutí při přesunu objektu pomocí sleep() – Java – Fórum – Programujte.com

 

Jan Vesely
~ Anonymní uživatel
22 příspěvků
20. 4. 2013   #1
-
0
-

 Potřeboval bych pomoc s přesunem objektu, vždycky když zmáčknu tlačítko, tak se mi program na chvíli zasekne. Co s tím?

package PresunObjektu;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class PresunObjektu {

obrazce obrazce=new obrazce();
JFrame frame=new JFrame();
JButton but1 = new JButton("posun o 100 PX");
public PresunObjektu() {
 
  //-----------Frame-----------------------------------
  frame.setSize(400, 400);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(obrazce);
  frame.add(but1, BorderLayout.NORTH);
 
  //-------------Tlacitko, Posluchac-------------------
  but1.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
      try {
      presunObjektu();
     } catch (InterruptedException e1) {
      e1.printStackTrace();
     }
     }
  });
  frame.setVisible(true);
}

public  void presunObjektu() throws InterruptedException{
  for(int X=0;X<100;X++){
   obrazce.X++;
   obrazce.repaint();
   Thread.sleep(100);
  }
}
}

class obrazce extends JComponent{
int X=50;
int Y=50;
public void paint(Graphics g){
  g.drawRect(X, Y, 50, 50);
}
}
Nahlásit jako SPAM
IP: 194.12.42.–
Dolan
~ Anonymní uživatel
2 příspěvky
20. 4. 2013   #2
-
0
-

Namiesto sleep() použi nejaký časovač

Nahlásit jako SPAM
IP: 213.81.220.–
Jan Vesely
~ Anonymní uživatel
22 příspěvků
20. 4. 2013   #3
-
0
-

Použil jsem jiný, ale stále to tak dělá a zasekává se to;)

 	long t0,t1;
	t0=System.currentTimeMillis();
	do{
	    t1=System.currentTimeMillis();
	}
	while (t1-t0<100);
Nahlásit jako SPAM
IP: 194.12.42.–
sleepy0
Stálý člen
21. 4. 2013   #4
-
0
-

A co takto pouzit iny thread na prekreslovanie.

Nahlásit jako SPAM
IP: 158.195.204.–
ingiraxo+15
Grafoman
21. 4. 2013   #5
-
+1
-
Zajímavé

celou funkci "presunObjektu" musí vykonávat jiný vlákno, pokud použiješ sleep() v aktuálním vlákně, tak se to logicky zasekne vše, co je v tom vláknu (celej Frame)

klidně si udělej automatický překreslení přes Timer, kde se bude volar repaint() pravidelně třeba každých 10ms, ale to záleží co přesně ta app bude dělat

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Dolan
~ Anonymní uživatel
2 příspěvky
22. 4. 2013   #6
-
0
-

#5 ingiraxo
omg načo nové vlákno na prekresľovanie + ďalšie vlákno na timer? 

Nahlásit jako SPAM
IP: 158.193.87.–
Jan Vesely
~ Anonymní uživatel
22 příspěvků
22. 4. 2013   #7
-
0
-

Nechce mi sem někdo dát kus funkčního  kódu? :)

Nahlásit jako SPAM
IP: 194.12.42.–
ingiraxo+15
Grafoman
22. 4. 2013   #8
-
0
-

#6 Dolan
hm? já nic takovýho nenapsal, jen mu vysvětluju, proč se mu to "zasekne" a jak tomu zabránit, pokud máš lepší nápad, tak ho sem napiš...

#7 Jan Vesely
a je vážně nutný tam mít sleep() ? kdyžtak se podívej zde, máš tam i příklady na vlákna http://v1.dione.zcu.cz/java/sbornik/16.html

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
sleepy0
Stálý člen
23. 4. 2013   #9
-
0
-
Nahlásit jako SPAM
IP: 158.195.204.–
Jan Vesely
~ Anonymní uživatel
22 příspěvků
23. 4. 2013   #10
-
0
-

Sleepy díky, moc jsi mi pomohl, už jsem si to přizpůsobil jak jsme potřeboval díky ;).

Nahlásit jako SPAM
IP: 194.12.42.–
JanVesely
~ Anonymní uživatel
1 příspěvek
25. 4. 2013   #11
-
0
-

Ještě jedna drobnost potřeboval bych předat parametrem odkaz na instanci třídy animation do třídy MyTask, abych mohl měnit její atributy, konkrétně int x.

package PresunObjektu;

import java.awt.Graphics;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class animation extends JComponent {
	
	
	//vytvoření odkazu na timer
	Timer timer = new Timer("Printer");
	
	public int x=0;
	
	public animation() {
		JFrame frame=new JFrame();
		frame.setSize(400, 400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//vytvoření odkazu na prováděcí úlohu
		MyTask t = new MyTask();
	    timer.schedule(t, 0, 1000);
	    
	    frame.getContentPane().add(this);
		frame.setVisible(true);
	}
	public void paint(Graphics g) {
		g.fillRect(x, 50, 50, 50);
		
	}
	

}

class MyTask extends TimerTask {

	public void run() {
       
    }
}
Nahlásit jako SPAM
IP: 194.12.42.–
sleepy0
Stálý člen
26. 4. 2013   #12
-
0
-

   

class MyMask extends TimerTask{
	private Animation animation = null;
	//1. sposob
	public MyMask(Animation animation){
		this.animation = animation
	}
	//2. sposob
	public void setAnimation(Animation animation){
		this.animation = animation;
	}

	public void run(){

	}
}
Nahlásit jako SPAM
IP: 158.195.204.–
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, 18 hostů

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ý