Probleme beim Repaint

Status
Nicht offen für weitere Antworten.

robb

Bekanntes Mitglied
Hiho Leute,

ich bin gerade dabei einen ClosestPair Algortihmus mit BruteForce zu Implementieren.
Der Algorithmus funktioniert soweit sehr gut nur hab ich ein Problem meine einzelnen Schritte zu visualisieren.

Ich habe ein JPanel in dem mit Hilfe von der Methode "paintComponent(Graphics g)" gezeichnet wird und rufe diese über repaint() auf.

Code:
public class BruteForceDrawPanel extends JPanel implements BruteForceListener {

	private Vector ivVectorPoints = new Vector();

	private Vector ivVectorLinePoints = new Vector();

	private ClosestPair ivClosestPair;

	public BruteForceDrawPanel() {
		super();
		initGui();
	}

	private void initGui() {
		this.setLayout(new BorderLayout());
		//Mouse Listener um Punkte auf dem Spielfeld anzuzeigen
		this.addMouseListener(new MouseListener() {

			public void mouseClicked(MouseEvent e) {
				

			}

			public void mouseEntered(MouseEvent e) {
				

			}

			public void mouseExited(MouseEvent e) {
				

			}
			
			public void mousePressed(MouseEvent e) {
				DrawPointType dpt = new DrawPointType();
				dpt.setPoint(e.getPoint());
				dpt.setPointColor(Color.RED);
				ivVectorPoints.add(dpt);

				repaint();

			}

			public void mouseReleased(MouseEvent e) {
				
			}

		});
	}

	
	
	public void paintComponent(Graphics g) {
		
		super.paintComponent(g);

		/** Mein Panel zeichnen**/

	}

	
	public void run(int pvAlgorithm) {
		
			ivClosestPair = new ClosestPair(ivVectorPoints);
			ivClosestPair.addBruteForceListener(this);
			ivClosestPair.run();
					
	}

	
	/**
	 * This method will be run, when the BruteForceAlgorithm evaluated a new
	 * value
	 * 
	 */
	public void changed() {
			Color lvCol= ivClosestPair.isFinished()?Color.GREEN: Color.RED;
			DrawPointType dpt1 = (DrawPointType) ivVectorPoints
					.get(ivClosestPair.getIndex1());

			dpt1.setLineColor(lvCol);

			ivVectorLinePoints.clear();
			ivVectorLinePoints.add(dpt1);

			DrawPointType dpt2 = (DrawPointType) ivVectorPoints.get(ivClosestPair.getIndex2());
			dpt2.setLineColor(lvCol);
			ivVectorLinePoints.add(dpt2);
			
			this.repaint();
	}

	

}

Und die Algorithmus Klasse:



Code:
package bruteforce.logic;

import java.awt.Point;
import java.util.Vector;

public class ClosestPair {

	private int ivIndex1 = 0;

	private int ivIndex2 = 0;

	private Vector ivPoints;
	
	private boolean ivFinished=false;

	private BruteForceListener ivListener;

	public ClosestPair(Vector pvPoints) {
		ivPoints = pvPoints;
	}

	public void run() {

		int min = Integer.MAX_VALUE;
		int dsqr = 0;
		Point lvP1;
		Point lvP2;

		ivFinished=false;
		// first loop from first point to the second last point
		for (int i = 0; i < ivPoints.size() - 1; i++) {
			// get the Point at index i
			lvP1 = ((DrawPointType) ivPoints.get(i)).getPoint();
			// second loop to compare all other points with the point at index
			// "i"
			for (int j = i + 1; j < ivPoints.size(); j++) {
				lvP2 = ((DrawPointType) ivPoints.get(j)).getPoint();
				// evaluate the distance between the points
				int dx, dy;
				dx = (int) (lvP1.getX() - lvP2.getX());
				dy = (int) (lvP1.getY() - lvP2.getY());
				dsqr = (dx * dx) + (dy * dy);
				// set the new indexes if the evaluated distance is lower than
				// the former distance
				if (min > dsqr) {
					ivIndex1 = i;
					ivIndex2 = j;
					min = dsqr;
				}
				ivListener.changed();
			}
			try{
				Thread.sleep(1000);
			
			}catch(InterruptedException e){
				
			}
		}
		ivFinished=true;
		

	}

	/**
	 * Set the Listener
	 * 
	 * @param pvListener
	 */
	public void addBruteForceListener(BruteForceListener pvListener) {
		ivListener = pvListener;
	}

	/**
	 * Remove the Listener
	 * 
	 */
	public void removeBruteForceListener() {

		ivListener = null;
	}

	/**
	 * Getter for the first index
	 * 
	 * @return index1
	 */
	public int getIndex1() {
		return ivIndex1;
	}

	/**
	 * Getter for the second index
	 * 
	 * @return index2
	 */
	public int getIndex2() {
		return ivIndex2;
	}

	public boolean isFinished() {
		return ivFinished;
	}

}

Die DrawPointType Klasse ist nur ein Wraper für die Visualisierung der einzelnen Punkte und Linien.

Problem hierbei ist, dass in der DrawPanel Klasse bei einem Changed-Event von dem ClosestPair Algorithmus das repaint() nicht die paintComponents() Methode aufruft.
Nur am Ende wird das Endresultat aufgerufen.
Kennt jemand ein ähnliches Problem? Oder weiss jemand wie ich nach jedem Aufruf des Change Events das Panel neu zeichnen kann?

mfg Robb
 
Die Sache mit den Threads solltest du dir nochmal ansehen. Du musst entweder von Thread erben, oder Runnable implementieren. Gestartet wird auch nicht mit run, sondern entweder
Code:
new MyThread().start()
, oder
Code:
new Thread(new MyRunnable()).start()
 
Hmm, ich will aber gar keinen Thread schreiben. Dieses Thread.Sleep(1000) soll nur als Delay dienen damit man sehen kann was gerade umgerechnet wird.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben