| 

.NET C# Java Javascript Exception

Bildflackern vermeiden

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Bildflackern vermeiden

Wicki - 07.08.2010 17:58
Hallo, <_42_52_ /> <_42_52_ /> habe noch nicht viel Groovy-Erfahrung. In dem nachfolgenden Code wird ein jpg-Bild dargestellt und mit der Maus bewegt. Dabei entsteht ein Bildflackern, das ich gern vermeiden möchte. Ich habe allerhand probiert, bin aber zu keiner Lösung gekommen. Bitte um Hilfe. <_42_52_ /> <_50_52_45_ CLASS="bbcode">package Hand; import groovy.swing.* import javax.swing.WindowConstants as WC import javax.swing.* import java.awt.* public class HandCl { def swing = new SwingBuilder() def frame def panel def hand, posHand def final X=0 def final Y=1 def spielLaeuft = false; static void main(String[] args) { new HandCl() } public HandCl() { hand = new ImageIcon(HandCl.class.getResource('Hand.jpg')) frame = swing.frame(title:'Handprogramm', location:[10,100], size:[1000, 600], defaultCloseOperation:WC.EXIT_ON_CLOSE) { panel = panel(background:[0,0,0], mouseDragged: { event -> handBewegen(event) } ) } frame.show() startAction() } def startAction() { def size = panel.size // die Hand wird in der rechten Hälfte positioniert posHand = [(int) (size.width * 0.75 - hand.iconWidth / 2), (int) (size.height / 2 - hand.iconHeight / 2), hand.iconWidth, hand.iconHeight] // Panel leer machen panel.graphics.color = [0,0,0] panel.graphics.fillRect(0,0,(int)size.width,(int)size.height) if(!spielLaeuft) { spielLaeuft = true Thread.start { while(spielLaeuft) { def recHand = new Rectangle(*posHand) } } // Hand zeichnen hand.paintIcon(panel, panel.graphics, *posHand[0..1]) } } def handBewegen(mouseEvent) { // Hand an alter Position loeschen panel.graphics.color = [0,0,0] panel.graphics.fillRect(*posHand) if(spielLaeuft) { // neue Position fuer Hand bestimmen posHand[X] = (int)(mouseEvent.x - hand.iconWidth / 2) posHand[Y] = (int)(mouseEvent.y - hand.iconHeight / 2) // Hand neu zeichnen hand.paintIcon(panel, panel.graphics, *posHand[0..1]) } } } <_42_52_ /> Das Bild ist im Dateianhang, prinzipiell könnte natürlich auch jeds andere Bild benutzt werden. <_42_52_ /> <_42_52_ /> Gruß Wicki <_44_49_56_ CLASS="attachments"> Dateianhänge:<_42_52_ /> <_41_ HREF="http://groovy-forum.de/file.php/2/75/Hand.jpg">öffnen | <_41_ HREF="http://groovy-forum.de/file.php/download/2/75/Hand.jpg">Download - Hand.jpg (8.7 KB)<_42_52_ />


Bildflackern vermeiden

Wicki - 07.08.2010 17:58
Hallo,

habe noch nicht viel Groovy-Erfahrung. In dem nachfolgenden Code wird ein jpg-Bild dargestellt und mit der Maus bewegt. Dabei entsteht ein Bildflackern, das ich gern vermeiden möchte. Ich habe allerhand probiert, bin aber zu keiner Lösung gekommen. Bitte um Hilfe.
package Hand;

import groovy.swing.*
import javax.swing.WindowConstants as WC
import javax.swing.*
import java.awt.*

public class HandCl {
	
	def swing = new SwingBuilder()
	def frame
	def panel
	def hand, posHand
	def final X=0
	def final Y=1
	def spielLaeuft = false;

	static void main(String[] args) {
		new HandCl()
	}
  
	public HandCl() {
		hand = new ImageIcon(HandCl.class.getResource('Hand.jpg'))

		frame = swing.frame(title:'Handprogramm',
				location:[10,100], size:[1000, 600],
				defaultCloseOperation:WC.EXIT_ON_CLOSE) {
			panel = panel(background:[0,0,0],
				mouseDragged: { event -> handBewegen(event) }
                        )
		}
		frame.show()
                startAction()
	}
  
	def startAction() {
          def size = panel.size
          // die Hand wird in der rechten Hälfte positioniert
          posHand = [(int) (size.width * 0.75 - hand.iconWidth / 2),
                                  (int) (size.height / 2 - hand.iconHeight / 2),
                                  hand.iconWidth, hand.iconHeight]
          // Panel leer machen
          panel.graphics.color = [0,0,0]
          panel.graphics.fillRect(0,0,(int)size.width,(int)size.height)

          if(!spielLaeuft) {
            spielLaeuft = true
            Thread.start {
              while(spielLaeuft) {
                def recHand = new Rectangle(*posHand)
              }
            }
            // Hand zeichnen
            hand.paintIcon(panel, panel.graphics, *posHand[0..1])
          }
	}
  
	def handBewegen(mouseEvent) {
          // Hand an alter Position loeschen
          panel.graphics.color = [0,0,0]
          panel.graphics.fillRect(*posHand)
          if(spielLaeuft) {
                    // neue Position fuer Hand bestimmen
                    posHand[X] = (int)(mouseEvent.x - hand.iconWidth / 2)
                    posHand[Y] = (int)(mouseEvent.y - hand.iconHeight / 2)
                    // Hand neu zeichnen
                    hand.paintIcon(panel, panel.graphics, *posHand[0..1])
          }
	}
}

Das Bild ist im Dateianhang, prinzipiell könnte natürlich auch jeds andere Bild benutzt werden.

Gruß Wicki
Dateianh&auml;nge:
&ouml;ffnen | Download - Hand.jpg (8.7&nbsp;KB)


Re: Bildflackern vermeiden

christian - 08.08.2010 07:59
Hallo Wicki,

für eine flüssigere Darstellung kannst du einen sogenannten "offscreen buffer" verwenden, da wird das Bild schon mal im Hauptspeicher angelegt, bevor es angezeigt wird. Im Internet und jedem guten Java-Buch dürfte es viele Beispiele dazu geben. Eine kurze Einführung gibt es bei Oracle (das sich im Link noch "Sun" nennt).

Gruß
Christian


Re: Bildflackern vermeiden

Wicki - 09.08.2010 13:38
Hallo Christian,

danke für Deine Antwort. Das DoubleBuffering ist mir bekannt und bei Swing soll es ja sogar funktionieren, wenn man bei der darzustellenden Komponente das Attribut "doubleBuffered" auf "true" setzt. Das habe ich bei dem Panel gemacht, leider erfolglos.

Gruß Wicki


Re: Bildflackern vermeiden

Wicki - 11.08.2010 19:56
Hallo,

inzwischen habe ich eine Lösung für das Problem. Statt des JPanel vom SwingBuilder nutze ich eine eigene Klasse, die beim SwingBuilder registriert wird und die die Darstellung übernimmt. Der Code sieht nun so aus:
package Hand;

import groovy.swing.*
import javax.swing.WindowConstants as WC
import javax.swing.*
import java.awt.*
import java.awt.event.*;

public class HandClN2 {
	
	def swing = new SwingBuilder()
	def frame
	def pan
	def hand, posHand
	def final X=0
	def final Y=1
	def spielLaeuft = false;

	static void main(String[] args) {
		new HandClN2()
	}
  
	public HandClN2() {
          //registriere eigene Komponente beim SwingBuilder
          swing.registerBeanFactory('myPan', MyPanel.class)
          hand = new ImageIcon(HandClN2.class.getResource('Hand.jpg'))

          frame = swing.frame(title:'Handprogramm',
                  location:[10,100], size:[1000, 600],
                  background:[0,0,0],
                  defaultCloseOperation:WC.EXIT_ON_CLOSE)
                  {
                    pan = myPan(background:[0,0,0],
                        mouseDragged: { event -> handBewegen(event) },
                        doubleBuffered: true  //irrelevant
                    )
                  }
          frame.show()
          pan.setImg1(hand)
          startAction()
	}
  
	def startAction() {
          def size = pan.size
          def w=(int)(frame.getSize().getWidth())
          def h=(int)(frame.getSize().getHeight())
          pan.xp=w
          pan.yp=h
          // die Hand wird in der rechten Hälfte positioniert
          posHand = [(int) (size.width * 0.75 - hand.iconWidth / 2),
                            (int) (size.height / 2 - hand.iconHeight / 2),
                            hand.iconWidth, hand.iconHeight]

          if(!spielLaeuft) {
            spielLaeuft = true
            // Hand zeichnen
//            hand.paintIcon(pan, pan.graphics, *posHand[0..1])
            pan.zeichne(*posHand[0..1])
            println("Gestartet:"+posHand[0..1])
          }
	}
  
	def handBewegen(mouseEvent) {
          if(spielLaeuft) {
              // neue Position für Hand bestimmen
              posHand[X] = (int)(mouseEvent.x - hand.iconWidth / 2)
              posHand[Y] = (int)(mouseEvent.y - hand.iconHeight / 2)
              // Hand neu zeichnen
//              hand.paintIcon(pan, pan.graphics, *posHand[0..1])
              pan.zeichne(*posHand[0..1])
          }
	}
}

class MyPanel extends JComponent {
  private int x,y,xp,yp,imageWidth,imageHeight;
  private Image img1;
  public void paint(Graphics g) {
    //Hintergrund des Gesamtfensters löschen
    g.setColor(Color.black);
    g.fillRect(0, 0,xp,yp);
    //Bild zeichnen
    g.drawImage(img1, x, y, this);
  }
  public zeichne(int x, int y) {
    setX(x)
    setY(y)
    repaint()  //ruft paint
  }
  public void setImg1(ImageIcon img) {
    this.img1 = img.getImage();
    imageWidth=img1.getWidth();
    imageHeight=img1.getHeight();
  }
  //Koordinaten des Bildes
  public void setX(int x) {this.x=x}
  public void setY(int y) {this.y=y}
  //Koordinaten gesamtes Fenster
  public void setXp(int x) {this.xp=x}
  public void setYp(int y) {this.yp=y}
}

Gruß Wicki


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Bildflackern vermeiden" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.