Scrollen in Schleife - repaint() zündet nicht

Deine Bedenke und Gründe auf eine andere Sprache umzusteigen sind eigentlich völlig unbegründet!
Wenn du bei einer Kleinigkeit gleich die Sprache wechseln musst, dann empfehle ich dir gleich eine eigene zu schreiben.

Kleine Anmerkung: Mit Modula-2 und Pascal von Nikolaus Wirth (ETH Zürich) war ich ablsolut glücklich!:)
Aber, da ich vielleicht einmal Geld verdienen will: Welche Firma setzt nicht auf Java, .net, und SQL bzw. PL/SQL?

p.s.: Und Modula-2 war wirklich so schöööön:-)
 
Wie komme ich denn um paint() bei Benutzung der Klasse Graphics2D herum? Die Klasse meintest Du doch?

Hier mal ein Beispiel einer Methode, mit der du ein Rechteck auf ein JPannel zeichnest:
Code:
public void meineMalMethode(JPannel _jpanZeichenfläche){
  Graphics2D g2d = (Graphics2D) _jpanZeichenfläche.getGraphics();
  g2d.drawRect(5, 5, 10, 10);
}
 
Mit Java2D kannst du auch noch einiges mehr machen: Rendern, Farbverläufe, überschneidungen, eigene Grafische Objekte, Bildbearbeitung...
 
Mea culpa, mea maxima culpa: Habe gerade den Fehler gefunden:

Code:
s.getLeinwand().paintImmediately(x1, y1, x2, y1);

Es muß natürlich heißen:

Code:
s.getLeinwand().paintImmediately(x1, y1, x2, y2);
Jetzt gehts (zwar langsam)
:-( T´schuldingung, Jungs:-(

Aber ganz herzlichen Dank noch zu den Tipps: Insbesondere paintImmediatly() und
Graphic2D !
Zerknirscht,
Ulrich
 
Neues Problem ....Listener zündet nicht

Jetzt hat sich leider ein neues Problem ergeben:
Ich habe das Horizontale Scrollen extra in einem eigenen Thread programmiert, den ich auch mit .start und nicht .run ;-) starte. Damit strebte ich an, die Eventqueue zu entlasten.
Erfolg: Keiner!
Meine durch Tastatureingaben getriggerte Methode zündet erst nach Beendigung des Threads.
1) Soll ich einen neues Thema dafür anlegen?
2) Kennt jemand das Problem?
3) Braucht Ihr über den bisherigen hinausgehenden Quellcode?
 
Nein, das vertikale Scrollen habe ich analog implementiert, der Keylistener zündet auch erst nach Beendigung des Scroll-Threads:

Code:
package haupt;

import horcher.EscapeTaste;

import java.awt.image.BufferedImage;
import leinwand.Leinwand;

public  class ScrollHorizontal implements Runnable{

	private Steuerung s = null;
	private Leinwand lw = null;
	private BufferedImage i = null;
	int[] iData = null;
	int[] iDat = null ;
	private int w = 0, h = 0;
	
	public ScrollHorizontal(Steuerung s) {
		this.s = s;
		i = s.getFlaeche();
		lw = s.getLeinwand();
		w = i.getWidth();
		h = i.getHeight();
		iData = new int[(w-1)*h];
		iDat = new int[h];
		s.resetEnde();
		lw.setFocusable(true);
		lw.requestFocus();
		lw.addKeyListener(new EscapeTaste(s));
		new Thread(this).start();
	}
	
	public void run() {
		int j = 0;
		while (j<10 & !s.isEnde()) {
			lw.setFocusable(true);
			lw.requestFocus();
			if (lw.hasFocus()) System.out.println("h-Fokus: Leinwand");
			if (s.isEnde()) System.out.print("e");
			if (!s.isEnde()) System.out.print("n");
			i.getRGB(0, 0 , w-1, h, iData, 0, w-1);
			i.getRGB(w-1, 0, 1, h, iDat, 0, 1);
			i.setRGB(0, 0, 1, h, iDat, 0, 1);
			i.setRGB(1, 0 , w-1, h, iData, 0, w-1);
			lw.setLeinwand(i);
			lw.paintImmediately(
					(int) lw.getLocation().getX(), 
					(int) lw.getLocation().getY(),
					lw.getWidth(),
					lw.getHeight());
			lw.setFocusable(true);
			lw.requestFocus();
			if (lw.isFocusOwner()) System.out.println("1");
			j++;
			try {
				Thread.sleep(20);
			}
			catch(InterruptedException ex){}
		}
		s.setFlaeche(i);
	}
}

lw ist dabei eine JComponent, welche in Steuerung konstruiert wird, und auf welche ich mit getLeinwand zugreife.

Klasse Steuerung
Code:
	public void scrollHorizontal() {
		new ScrollHorizontal(this).run();
	}

	public void setEnde() {
		System.out.println("Ende");
		this.ende = true;
	}

Code:
package ereignisse;

import haupt.Steuerung;

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

public final class HorizontalScrollen implements ActionListener {
	
	private Steuerung s = null;

	public void actionPerformed(ActionEvent e) {
		if (!s.isKugelDarstellung()) s.scrollHorizontal();
	}

	public HorizontalScrollen(Steuerung s){
		this.s = s;
	}
}

Code:
package horcher;


import haupt.Steuerung;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class EscapeTaste implements KeyListener {

	private Steuerung s = null;
	
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode()==KeyEvent.VK_ESCAPE) s.setEnde();
	}

	public void keyReleased(KeyEvent e) {
	}

	public void keyTyped(KeyEvent e) {
	}
	
	public EscapeTaste(Steuerung s) {
		this.s = s;
	}
}

Die EventQueue kann es eigentlich nicht sein, aber wieso wird Ende erst gesetzt, wenn der Thread ScrollHorizontal.start beendet ist?
 
Ist ja auch klar dass er ruck zuck fertig ist. Du machst gar keine Pausen in deiner Schleife deines Threads. Ergo, du kannst gar net sehen wie schnell er des macht :rolleyes:

Füg das mal am Ende deiner Schleife in den Thread ein:
Code:
sleep(500);

Die Zahl gibt an wie viel Millisekunden er wartet, also 1000 = 1 Sekunde.

Viel Glück (Ich hoffe ich hab dich richtig verstanden)
 
Habe ich gerade versucht, und Thread.sleep(20) auf sogar Thread.sleep(5000) erhöhte:
Code:
		while (j<10 & !s.isEnde()) {
			lw.setFocusable(true);
			lw.requestFocus();
			if (lw.hasFocus()) System.out.println("h-Fokus: Leinwand");
			if (s.isEnde()) System.out.print("e");
			if (!s.isEnde()) System.out.print("n");
			i.getRGB(0, 0 , w-1, h, iData, 0, w-1);
			i.getRGB(w-1, 0, 1, h, iDat, 0, 1);
			i.setRGB(0, 0, 1, h, iDat, 0, 1);
			i.setRGB(1, 0 , w-1, h, iData, 0, w-1);
			lw.setLeinwand(i);
			lw.paintImmediately(
					(int) lw.getLocation().getX(), 
					(int) lw.getLocation().getY(),
					lw.getWidth(),
					lw.getHeight());
			lw.setFocusable(true);
			lw.requestFocus();
			if (lw.isFocusOwner()) System.out.println("1");
			j++;
			try {
				Thread.sleep(500);
			}
			catch(InterruptedException ex){}
		}

Die Meldung "Ende" kommt aber dennoch nach(!) den Rundenmeldungen "n":(
Kann es vielleicht doch am Fokus liegen, obwohl ich geschrieben habe:
Code:
            lw.setFocusable(true);
            lw.requestFocus();
?
 
Zurück