Hi
Ich habe hier eine Aufgabe für die Uni und da stehe ich etwas auf dem Schlauch. Grob geht es um folgendes. In einer JList sollen komplexe Zahlen angezeigt werden (Instanzen der selbstgeschrieben Klasse Complex die von einre Instanz von DefaultListModel verwaltet werden). In einem JPanel sollen nun alle Zahlen in der komplexen Ebene dargestellt werden (einfache drawLine() Zeichnungen). Mein Problem ist aber nun, dass ich nicht weiß, wie ich ich dem JPanel bzw. der selbstgeschriebenen Klasse CoordinateSystem, die von JPanel abgeleitet ist, klar mache, dass alle Vektoren der komplexen Ebene neu gezeichnet werden sollen, wenn ein Listeneintrag hinzugefügt oder gelöscht wurde.
Meinem Verständnis nach wollte ich jetzt der Instanz von DefaultListModel einen ListDataListener spendieren, der dem Koordinatensystem sagt, dass sich etwas an dem Listeninhalt geändert hat und es dann die Elemente des DefaultListModels durch geht und alles neu zeichnet. So viel zur Theorie. Liege ich mit meiner Überlegung richtig oder bewege ich mich in die falsche Richtung? Ich füge mal die Klasse CoordinateSystem an. Falls noch mehr Code benötigt wird, reiche ich gerne alles nach.
Vielen Dank schon mal für jede Hilfe.
PS: Meine reinen Java-Kenntnisse begrenzen sich auf eine einsemestrige Vorlesung.
PPS: Vielleicht hat ja noch jemand eine Idee, wie ich das, meiner Meinung nach, wilde Konstrukt in den Zeilen 28 bis 30 zum kopieren der DefaultListModel Elemente in eine ArrayList verbessern kann.
Ich habe hier eine Aufgabe für die Uni und da stehe ich etwas auf dem Schlauch. Grob geht es um folgendes. In einer JList sollen komplexe Zahlen angezeigt werden (Instanzen der selbstgeschrieben Klasse Complex die von einre Instanz von DefaultListModel verwaltet werden). In einem JPanel sollen nun alle Zahlen in der komplexen Ebene dargestellt werden (einfache drawLine() Zeichnungen). Mein Problem ist aber nun, dass ich nicht weiß, wie ich ich dem JPanel bzw. der selbstgeschriebenen Klasse CoordinateSystem, die von JPanel abgeleitet ist, klar mache, dass alle Vektoren der komplexen Ebene neu gezeichnet werden sollen, wenn ein Listeneintrag hinzugefügt oder gelöscht wurde.
Meinem Verständnis nach wollte ich jetzt der Instanz von DefaultListModel einen ListDataListener spendieren, der dem Koordinatensystem sagt, dass sich etwas an dem Listeninhalt geändert hat und es dann die Elemente des DefaultListModels durch geht und alles neu zeichnet. So viel zur Theorie. Liege ich mit meiner Überlegung richtig oder bewege ich mich in die falsche Richtung? Ich füge mal die Klasse CoordinateSystem an. Falls noch mehr Code benötigt wird, reiche ich gerne alles nach.
Vielen Dank schon mal für jede Hilfe.
PS: Meine reinen Java-Kenntnisse begrenzen sich auf eine einsemestrige Vorlesung.
PPS: Vielleicht hat ja noch jemand eine Idee, wie ich das, meiner Meinung nach, wilde Konstrukt in den Zeilen 28 bis 30 zum kopieren der DefaultListModel Elemente in eine ArrayList verbessern kann.
Java:
package aufgabe3;
import javax.swing.DefaultListModel;
import javax.swing.JPanel;
import aufgabe1_1.Complex;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
public class CoordinateSystem extends JPanel {
private int xMax;
private int yMax;
private int xMaxIndex;
private int yMaxIndex;
private int xZero;
private int yZero;
private int dx;
private int dy;
private ArrayList<Complex> arrayList;
public CoordinateSystem(DefaultListModel listModel) {
xMax = this.getWidth();
yMax = this.getHeight();
xZero = 5 + (xMax - 10) / 2;
yZero = 5 + (yMax - 10) / 2;
Complex[] temp = new Complex[listModel.size()];
listModel.copyInto(temp);
arrayList = new ArrayList<Complex>(Arrays.asList(temp));
}
protected void paintComponent(Graphics g) {
super.paintComponents(g);
double xMaxLocal = 0.0, yMaxLocal = 0.0;
//Koordinatenkreuz zeichnen
g.setColor(Color.black);
g.drawLine(this.getWidth() / 2, 5, this.getWidth() / 2,
this.getHeight() - 5);
g.drawLine(5, this.getHeight() / 2, this.getWidth() - 5,
this.getHeight() / 2);
if(arrayList.size() >0){
for (int i = 0; i < arrayList.size(); i++) {
if (Math.abs(arrayList.get(i).getReal()) > xMaxLocal) {
xMaxLocal = Math.abs(arrayList.get(i).getReal());
xMaxIndex = i;
}
if (Math.abs(arrayList.get(i).getImag()) > yMaxLocal) {
yMaxLocal = Math.abs(arrayList.get(i).getImag());
yMaxIndex = i;
}
}
//Skalierungsfaktoren festlegen
dx = (xZero-5)/(int)xMaxLocal;
dy = (yZero-5)/(int)yMaxLocal;
for(int i = 0; i < arrayList.size(); i++){
g.setColor(Color.black);
g.drawLine(xZero, yZero, dx*(int)arrayList.get(i).getReal(), dy*(int)arrayList.get(i).getImag());
}
}
}
}