JPanel einblenden

  • Themenstarter Themenstarter modad
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

modad

Gast
Tag Zusammen,

hab folgende Problem: Ich würde gerne ein JPanel einblenden lassen. Dazu habe ich mir gedacht mache ich einen Thread auf, den ich im "paint()" starte, und der dann x-mal die super-Paint Methode aufruft, mit erhöhter Transparenz. Transparenz generell geht, hab das ganze schon mal erfolgreich ohne Thread mit einem Frame gemacht (durch eine "einfache" While Schleife, was zum einen natürlich suboptimal ist, weil die EinblendGeschwindigkeit dann vom System abhängt, und bei meinem Panel hat das irgendwie nicht hin gehauen)

Jemand eine Idee, warum die Einblendung hier nicht statt findet? Meine Vermutung wäre ja ein Problem beim Zeichen der GUI, das die Threads sich in die quere kommen, aber bin in der Thread-Geschichte nicht so drin als das ich das beurteilen könnte

Code:
package dd.servlets;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestPanel extends JPanel implements Runnable {

	private Graphics gg;
	private float alpha;

	public TestPanel() {
		super();
		this.setBackground(Color.RED);
		alpha = 0.00f;

	}

	@Override
	public void paint(Graphics g) {
		// Transparenz generell geht:
		// Composite
		// alphaCompositge=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
		// 0.1f);
		// ((Graphics2D)g).setComposite(alphaCompositge);
		// super.paint(g);

		// Im Thread geht es nicht:
		if (alpha == 0.00f) {
			Thread t = new Thread(this);
			gg = g;
			t.start();
		} else {
			super.paint(g);
		}

	}

	private void paintIt(Graphics g, float alpha) {
		Composite alphaCompositge = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
		((Graphics2D) g).setComposite(alphaCompositge);
		super.paint(g);
	}

	public void run() {
		while (alpha < 1.00f) {
			alpha = alpha + 0.01f;
			System.out.println("Paint: " + alpha);

			paintIt(gg, alpha);

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
 
nur kurz überflogen aba muss man nicht noch irgendwie auf die public void run() vom thread her zugreifen???
 
? ich implementiere Runnable, und übergebe dem Thread die Klasse

Thread t = new Thread(this);

und dann starte ich den Thread:

t.start();


Das geht ja auch soweit, meine SystemOuts bekomme ich innerhalb des Threads, aber er painted nicht 🙁
 
Müsstest du nicht statt paint(Graphics g) paintComponent überschreiben?
Hier wirste bestimmt auch fündig:link
 
Oder das hier, besser gehts nicht denk ich.

Quaxli hat gesagt.:
Einstieg in die Spieleprogrammierung mit Java

Autor: Quaxli

Beschreibung: Das Tutorial zeigt eine Möglichkeit auf, wie man kleinere Spiele in Java selbst programmiert.

Link: hier

Da steht genau das drin was du wissen willst.
 
@selber Gast:
Danke!!! 😎

@modad:
Es hilft, wenn man bei Problemen ein lauffähiges Beispiel hier rein stellt. Da die Liste der Änderungen an Deinem Code recht lang war, habe ich Dir eins gebastelt. Vergleichen darfst Du es dann selbst 🙂

Code:
import java.awt.*;

import javax.swing.*;

public class TestPanel extends JPanel implements Runnable {

	private static final long	serialVersionUID	= 1L;

	private float	alpha;
	boolean active = true;
	
	public static void main(String[] args){
		new TestPanel();
	}

	public TestPanel() {
		this.setBackground(Color.green);
		alpha = 0.00f;
		
		JFrame frame = new JFrame("ich bin ein LAUFFÄHIGES Beispiel");
		frame.setSize(300,300);
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.setVisible(true);

		if (alpha == 0.00f) {
			Thread t = new Thread(this);
			t.start();
		}
	}

	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Composite alphaCompositge = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
		Graphics2D g2 = (Graphics2D)g;
		g2.setComposite(alphaCompositge);
		g2.setColor(Color.red);
		g2.fillRect(0, 0, getWidth(), getHeight());
	}


	public void run() {
		
		while (active) {

			repaint();
			
			alpha += 0.01f;
			if(alpha>=1.0f){
				active = false;
			}

			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben