Swing repaint, repaint, repaint

  • Themenstarter Themenstarter javamacher
  • Beginndatum Beginndatum
J

javamacher

Gast
Hallo,
ich habe ein (in meinen Augen) gewaltiges Problem mit der Methode repaint().
Ich mache ein Image und füge es derzeit einem JFrame hinzu.
Im Grunde klappt alles auch ganz fein und nett, solange man sich ja nicht ans Minimieren oder verschieben des Fensters macht, denn durch das verschieben oder minimieren zeichnet er mir imme rwieder das nächste BIld. Also im grunde handelt es sich um eine reihe von bildern welche ich nur über
einen button repainten möchte.
Also habe ich gegooglet und bin auf jdialog gestoßen. dieser umgeht nun das problem mit dem minimieren, was auch wunderbar so ist, aber das problem mit dem repaint beim verschieben bleibt und lässt sich vermutlich auch nicht verhindern, wenn ich das fenster immer zurück an den ursprung stellen lasse.
Entschuldigt die grausame Rechtsschreibung, es ist spät 😳

Würde mich über Vorschläge oder Ideen sehr freuen.
 
Wir würden uns über ein bissl' Code sehr freuen... insbesondere die Bereiche mit den paint-Methoden. Ich wette fast, dass dort ein Zähler für die einzelnen Bilder hochgezählt wird. Zumindest wird dort dafür gesorgt, dass das Bild getauscht wird. Fenster öffnen, vergrössern, verkleinern oder verschieben haben nunmal ein repaint zur Folge, den man nicht verhindern kann. Deswegen wohl auch dieses Verhalten.
 
hier die klasse die beim repaint neu aufgerufen wird du hast recht mit dem index, der ist aber leider auch dringend nötig ich habe überall wos ging abkürzungen reingebaut, denn es geht ja nicht ums laden der bilder...

Java:
public class Painting extends JPanel {
	
	private static int index = 0;

	public void paintComponent(Graphics g) {
		
		g.setColor(Color.black);
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		
		
		Image 1 = new ImageIcon("1").getImage();
		Image 2= new ImageIcon("2").getImage();
		Image 3= new ImageIcon("3").getImage();
		Image 4= new ImageIcon("4").getImage();
		
		switch (index) {
		case 0: Main.getFrame().repaint(); break;
		case 1:
			g.drawImage(1, 10, 10, 450, 500, this);
			break;
		case 2:
			g.drawImage(2, 10, 10, 400, 550, this);
			break;
		case 3:
			g.drawImage(3, 10, 10, 400, 550, this);
			break;
		case 4:
			g.drawImage(4, 10, 10, 400, 550, this);
			break;

		default: g.drawImage(1, 10, 10, 400, 400, this);
			break;
			
			
		}
		
		index++;
	
	}
	public static int getIndex() {
		return index;
	}
}



und hier der code zum button der als allereinzigster den repaint aufrufen sollte.


Java:
	public class bildwechsel implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
		
			Main.getFrame().repaint();
	
			Main.getA().setText("");
}


ich habe auch einen repaint ignore versuch in der main gestartet und nur im actionlistener um die im letzten codestück genannte Main.getFrame().repaint(); eine auflösung dieses repaint ignores aber es funzt nicht

hier noch der entscheidende part in der main

Java:
	bildpanel = new Painting();
		bildpanel.setPreferredSize(new Dimension(600, 600));
		bildpanel.setBackground(Color.black);
		frame.add(BorderLayout.CENTER,bildpanel);
		bildpanel.setVisible(true);
 
[java=11] Image 1 = new ImageIcon("1").getImage();
Image 2= new ImageIcon("2").getImage();
Image 3= new ImageIcon("3").getImage();
Image 4= new ImageIcon("4").getImage();[/code]

in Java dürfen Variablennamen NICHT mit einer Zahl beginnen...!!!

Sowas dürftest du nie kompiliert bekommen...wenn du ein KSKB zustande bekommst, zeige ich dir gerne wie das funktionieren könnte.
 
ist korrekt... aber es sind ja auch nur abkürzungen... für den text der da stand.
ich wünschte mir nur eine idee wie man ein image in einem jpanel durch methodenaufruf ausgeben kann und nicht durch repaint... dann könnte ich die methode selbstständig aufrufen und wäre nicht vom repaint abhängig was erhebliche vorteile bergen würde....
 
In deiner Paint methode sollst du nichts anderes machen als zeichnen. Sämtliche logik oder initialisierung (bilder laden, zähler hochzählen, index verändern) hat dort nichts zu suchen und ein repaint im paintComponent schon gar nicht. Wenn du willst dass sich alle x millisekunden die anzeige ändert, brauchst du einen Thread, der dir den index verändert und dann x ms schläft.

Edit, vielleicht so anschaulicher:
Java:
class BildKomponente extends JComponent
{
BufferdImage[] bilder;
int index=0;
BildKomponente()
{
ladeBilder();
}

public nächstesBild()
{
index=(index+1)%bilder.length;
}

public void paintComponent(Graphics g)
{
g.drawImage(bilder[index],0,0,null);
}
}
Und dein Thread ruft jetzt in einer Schleife nächstesBilde(), repaint() und sleep(x) auf.
 
Zuletzt bearbeitet:
and don´t forget to call the super.methodnameCall() at first...

Java:
public void paintComponent(Graphics g){ 
                     super.paintComponent(g);
 
Na also... da ist es doch schon... "index++" gehört nicht in die "paintComponent()"! Mach da 'nen Member von und pack's in den ActionListener.
[EDIT]Oh... hab' bei den ganzen Beschwerden der anderen um bERt0r's Beitrag drumherum gelesen...[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben