Hallo zusammen!
Ich möchte Rechtecke zeichnen und habe mein Programm in 4 Klassen aufgeteilt:
Controller, Model(=Formen), View und Fenster
- Fenster - verwaltet die View (JPanel)
- Model(=Formen) - verwaltet die Formen in einer Liste
- Controller - steuert die Daten
- View - hier soll gezeichnet werden und hier liegt mein Problem
Der Observer scheint zu funktionieren, da die Daten in der Methode update() ankommen. System.out zeigt folgendes:
Update: Rechteck/10/10/100/50
Update: Rechteck/20/20/80/70
Aber diese Daten kommen leider nicht in paintComponent() an:
PaintComponent: Kreis/0/0/0/0
PaintComponent: Kreis/0/0/0/0
Vielen Dank für Eure Mühen,
Petra
[Java=42]
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/*
* Controller enthält main()
*/
public class Controller {
Formen formenListe;
public Controller(){
new Fenster();
View formenView=new View();
formenListe =new Formen();
formenListe.addObserver(formenView);
}
public void add(String s){
formenListe.add(s);
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Controller c=new Controller();
c.add("Rechteck,10,10,100,50");
c.add("Rechteck,20,20,80,70");
}
});
}
}
/* *************************************************************
* Model
*/
class Formen extends Observable{
ArrayList<String> liste=null;
public Formen()
{
liste=new ArrayList<String>();
}
public void add(String s)
{
liste.add(s);
setChanged();
notifyObservers();
}
public String[][] getFormen()
{
//In jeder Zeile sind 5 Werte enthalten
String[][] s=new String[liste.size()][5];
for (int i=0;i<liste.size();i++)
{
s=liste.get(i).split(",");;
}
return s;
}
}
/* *************************************************************
* Fenster
*/
class Fenster extends JFrame
{
private static final long serialVersionUID = 1L;
View view=new View();
public Fenster()
{
super();
this.setSize(254, 162);
this.setTitle("Zeichnen");
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
view.setSize(this.getWidth(),this.getHeight());
add(view);
this.setVisible(true);
}
}
/* *************************************************************
* View
*/
class View extends JPanel implements Observer{
private static final long serialVersionUID = 1L;
private String form;
private int x1,x2,y1,y2;
public View(){
super();
this.setSize(300, 200);
this.setLayout(null);
form="Kreis";
x1=0;x2=0;y1=0;y2=0;
System.out.println("Init: "+form+"/"+x1+"/"+y1+"/"+x2+"/"+y2);
this.setVisible(true);
}
@Override
protected void paintComponent( Graphics g ) {
super.paintComponents( g );
g.setColor(Color.black);
g.drawRect( x2, y2, x1-x2, y1-y2 );
System.out.println("PaintComponent: "+form+"/"+x1+"/"+y1+"/"+x2+"/"+y2);
}
public void update(Observable arg0, Object arg1){
String[][] s=((Formen)arg0).getFormen();
for (int i=0;i<s.length;i++){
form=s[0];
x1=Integer.parseInt(s[1]);
y1=Integer.parseInt(s[2]);
x2=Integer.parseInt(s[3]);
y2=Integer.parseInt(s[4]);
System.out.println("Update: "+form+"/"+x1+"/"+y1+"/"+x2+"/"+y2);
this.revalidate();
}
}
}
[/Java]
Ich möchte Rechtecke zeichnen und habe mein Programm in 4 Klassen aufgeteilt:
Controller, Model(=Formen), View und Fenster
- Fenster - verwaltet die View (JPanel)
- Model(=Formen) - verwaltet die Formen in einer Liste
- Controller - steuert die Daten
- View - hier soll gezeichnet werden und hier liegt mein Problem
+Attribute:
#form,x1,x2,y1,y2
+Methoden:#View() - initialisiert die Attribute mit Kreis/0/0/0/0
#paintComponent()
#update()
#paintComponent()
#update()
Der Observer scheint zu funktionieren, da die Daten in der Methode update() ankommen. System.out zeigt folgendes:
Update: Rechteck/10/10/100/50
Update: Rechteck/20/20/80/70
Aber diese Daten kommen leider nicht in paintComponent() an:
PaintComponent: Kreis/0/0/0/0
PaintComponent: Kreis/0/0/0/0
Vielen Dank für Eure Mühen,
Petra
[Java=42]
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/*
* Controller enthält main()
*/
public class Controller {
Formen formenListe;
public Controller(){
new Fenster();
View formenView=new View();
formenListe =new Formen();
formenListe.addObserver(formenView);
}
public void add(String s){
formenListe.add(s);
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Controller c=new Controller();
c.add("Rechteck,10,10,100,50");
c.add("Rechteck,20,20,80,70");
}
});
}
}
/* *************************************************************
* Model
*/
class Formen extends Observable{
ArrayList<String> liste=null;
public Formen()
{
liste=new ArrayList<String>();
}
public void add(String s)
{
liste.add(s);
setChanged();
notifyObservers();
}
public String[][] getFormen()
{
//In jeder Zeile sind 5 Werte enthalten
String[][] s=new String[liste.size()][5];
for (int i=0;i<liste.size();i++)
{
s=liste.get(i).split(",");;
}
return s;
}
}
/* *************************************************************
* Fenster
*/
class Fenster extends JFrame
{
private static final long serialVersionUID = 1L;
View view=new View();
public Fenster()
{
super();
this.setSize(254, 162);
this.setTitle("Zeichnen");
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
view.setSize(this.getWidth(),this.getHeight());
add(view);
this.setVisible(true);
}
}
/* *************************************************************
* View
*/
class View extends JPanel implements Observer{
private static final long serialVersionUID = 1L;
private String form;
private int x1,x2,y1,y2;
public View(){
super();
this.setSize(300, 200);
this.setLayout(null);
form="Kreis";
x1=0;x2=0;y1=0;y2=0;
System.out.println("Init: "+form+"/"+x1+"/"+y1+"/"+x2+"/"+y2);
this.setVisible(true);
}
@Override
protected void paintComponent( Graphics g ) {
super.paintComponents( g );
g.setColor(Color.black);
g.drawRect( x2, y2, x1-x2, y1-y2 );
System.out.println("PaintComponent: "+form+"/"+x1+"/"+y1+"/"+x2+"/"+y2);
}
public void update(Observable arg0, Object arg1){
String[][] s=((Formen)arg0).getFormen();
for (int i=0;i<s.length;i++){
form=s[0];
x1=Integer.parseInt(s[1]);
y1=Integer.parseInt(s[2]);
x2=Integer.parseInt(s[3]);
y2=Integer.parseInt(s[4]);
System.out.println("Update: "+form+"/"+x1+"/"+y1+"/"+x2+"/"+y2);
this.revalidate();
}
}
}
[/Java]