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.
Und die Algorithmus Klasse:
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
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