Erstes "komplexeres" Prog AWT/GUI

  • Themenstarter Gelöschtes Mitglied 2635
  • Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gelöschtes Mitglied 2635

Gast
Hallo zusammen,

im Rahmen einer Übung brauche ich gerade Hilfe für ein erstes "komplexeres" Programm. Es geht darum eine Menge von Figuren zu zeichnen. Später soll man die Figuren auswählen können, Daten dazu anzeigen können, verschieben, Größe ändern etc. . Später.

Mein Problem besteht gerade darin, dass ich das Array mit den Figuren (Drawing.java) nicht ausgegeben bekomme (TDrawing.java).

Für Hilfe wäre ich sehr dankbar.


Schöne Grüße, Der Tino.


Hauptprogramm:

Code:
import java.awt.*;
import java.awt.event.*;

public class TDrawing
	extends Frame
	implements ActionListener, WindowListener {
	
	private Label circumference;
	private Label area;
	private TextField index;
	private TextField radius;
	private Drawing drawing;
	
	public TDrawing() {
		
		// Fenster einrichten
		Frame wnd = new Frame("TDrawing");
		wnd.setSize(640,480);
		wnd.setVisible(true);
		wnd.setBackground(Color.WHITE);
		wnd.addWindowListener(this);
		
		// Panel 1 einrichten
		Panel graphics = new Panel();
		graphics.setLayout(new FlowLayout());		
		
		// Panel 2 einrichten
		Panel menu = new Panel();
		menu.setLayout(new FlowLayout());
		menu.setBackground(Color.LIGHT_GRAY);
		menu.add(new Label("Index: "));
		index = new TextField();
		menu.add(index);
		menu.add(new Label("Radius: "));
		radius = new TextField();
		menu.add(radius);
		menu.add(new Button("OK"));
		menu.add(new Label("Umfang: "));
		circumference = new Label();
		menu.add(circumference);
		menu.add(new Label("Flaeche: "));
		area = new Label();
		menu.add(area);		
		
		// Panels zusammenfügen
		wnd.setLayout(new BorderLayout());
		wnd.add(graphics, BorderLayout.NORTH);
		wnd.add(menu, BorderLayout.SOUTH);
		wnd.pack();
	}
	
	public void paint(Graphics g) {
		drawing = new Drawing();
		drawing.draw(g);

		// HIER MUSS IRGENDWO DAS PROBLEM LIEGEN
		// WIESO GIBT ER MIR DIE FIGUREN NICHT AUS ???

	}
	
	public void actionPerformed(ActionEvent event) {

	}
	
	public void windowDeactivated(WindowEvent event) {
		
	}
	
	public void windowOpened(WindowEvent event) {

	}
	
	public void windowDeiconified(WindowEvent event) {
		
	}
	
	public void windowClosed(WindowEvent event) {
		
	}
	
	public void windowClosing(WindowEvent event) {
		setVisible(false);
		dispose();
		System.exit(0);
	}
	
	public void windowActivated(WindowEvent event) {

	}
	
	public void windowIconified(WindowEvent event) {
		
	}
	
	public static void main(String args[]) {
		TDrawing test = new TDrawing();
	}
	
}


Drawing.java mit dem Array der Figuren

Code:
import java.awt.*;

public class Drawing {
	
	public AbstrFigure[] shapes;
	public final int maxshapes = 3;
	
	public Drawing() {
		Circle c = new Circle(50,50,100,Color.CYAN,Color.BLUE);
		Square s = new Square(200,50,100,Color.BLACK,Color.GRAY);
		Rectangle r = new Rectangle(50,200,100,200,Color.GREEN,Color.YELLOW);
		shapes = new AbstrFigure[maxshapes];
		shapes[0] = c;
		shapes[1] = s;
		shapes[2] = r;
	}
	
	public void show() {
		for (int i = 0; i < maxshapes; i++) shapes[i].show();
	}
	
	public void draw(Graphics g) {
		for (int i = 0; i < maxshapes; i++) shapes[i].draw(g);
	}
	
	public static void main(String args[]) {
		/** Test der Klasse */
		Drawing test = new Drawing();
		test.show();
	}

}


Abstrakte Klasse, die die Figuren definiert

Code:
import java.awt.*;

abstract class AbstrFigure {

	public final double PI = 3.141592;
	protected double a,b,x,y;
	protected Color fillColor,lineColor;

	public void setPos (double x, double y) {
		/** Methode zur Aenderung der Position*/
		this.x = x;
		this.y = y;
	}
	
	public void setDim(double a, double b) {
		/** Methode zur Aenderung der Groesse*/
		this.a = a;
		this.b = b;
	}
	
	public void setColors(Color fC, Color lC) {
		/** Methode zur Aenderung der Farben fuer Flaeche und Kontur*/
		fillColor = fC;
		lineColor = lC;
	}

	public double getX() {
		/** Methode zur Rueckgabe von x */
		return x;
	}

	public double getY()	{
		/** Methode zur Rueckgabe von y */
		return y;
	}

	public double getA() {
		/** Methode zur Rueckgabe von a */
		return a;
	}

	public double getB() {
		/** Methode zur Rueckgabe des Radius */
		return b;
	}
	
	public String getColors() {
		/** Methode zur Rueckgabe der Farben */
		return ("fC: "+fillColor+" lC: "+lineColor);
	}

	abstract public void show();
		/** abstrakte Methode zur Ausgabe der Daten der Figur */
	
	abstract public double circumference();
		/** abstrakte Methode zur Bestimmung des Umfangs */
	
	abstract public double area();
		/** abstrakte Methode zur Bestimmung der Flaeche */
	
	abstract public void draw(Graphics g);
		/** abstrakte Methode zur Zeichnung der Figur */
	
}


Ausgestalte Klasse Circle.java

Code:
import java.awt.*;

public class Circle extends AbstrFigure {
	
	public Circle() {
		/** Konstruktor */		
	}
	
	public Circle(double x, double y, double a) {
		/** Konstruktor */
		this.x = x;
		this.y = y;
		this.a = a;
	}
	
	public Circle(double x, double y, double a, Color fC, Color lC) {
		/** Konstruktor */		
		this.x = x;
		this.y = y;
		this.a = a;
		this.fillColor = fC;
		this.lineColor = lC;
	}
	
	public double circumference() {
		/** Berechnung des Umfangs  (2*p*r) */
		return 2*PI*a;
	}
	
	public double area() {
		/** Berechnung der Kreisflaeche (p*r2) */
		return PI*a*a;
	}	
	
	public void show() {
		/** Ausgabe des Radius‘, des Umfangs und der Flaeche auf die Konsole */
		System.out.println("Radius:  "+a);
		System.out.println("Umfang:  "+circumference());
		System.out.println("Flaeche: "+area());
	}	
	
	public void draw(Graphics g) {
		/** Zeichnung der Figur */
		g.setColor(fillColor);
		g.fillOval((int)x,(int)y,(int)a,(int)a);
		g.setColor(lineColor);
		g.drawOval((int)x,(int)y,(int)a,(int)a);
	}
	
}
 

André Uhres

Top Contributor
Code:
public class TDrawing
...
    public TDrawing() {
...        
        DrawingPanel p = new DrawingPanel();
        wnd.add(p, BorderLayout.CENTER);
        wnd.pack();
    }
...
    class DrawingPanel extends Panel{
        public DrawingPanel(){
            drawing = new Drawing();
        }
        public void paint(Graphics g) {
            drawing.draw(g);
        }
    }
}
 
G

Guest

Gast
Nächstes Problem:

Ich habe jetzt also mittels der Klasse "DrawingPanel" die Ausgabe realisiert. In der Klasse "DrawingPanel" erstelle ich eine Instanz "drawing" der Klasse "Drawing". Jetzt will ich auf das Array "shapes" in der Klasse "Drawing" über dessen Instanz "drawing" zugreifen, aber das will irgend wie nicht klappen. Wie komme ich da ran? Ich will die Eigenschaften der Figuren ändern, die in dem Array "shapes" zusammengefasst sind.


Vielen Dank für Hilfe.
 
G

Gelöschtes Mitglied 2635

Gast
Sorry, dass war mein Beitrag als "Gast". Hab vergessen mich einzuloggen ...

Hier ist noch der Code der Klasse DrawingPanel:

Code:
public class DrawingPanel extends Panel {
    
	public Drawing drawing;
	
	public DrawingPanel() {
        drawing = new Drawing();
    }
	
    public void paint(Graphics g) {
        drawing.draw(g);
    }
    
}
 
G

Guest

Gast
Hmm, hab's jetzt ausgelagert. Schlimm? Das mit dem Zugriff konnte ich jetzt auch lösen.
 

André Uhres

Top Contributor
Wenn es funktioniert ist es ja gut :applaus:
Es ist nur etwas enttäuschend für jemanden der diesen Thread liest und nach einer ähnlichen Lösung sucht,
wenn dann zum Schluss nur steht: Das mit dem Zugriff konnte ich jetzt auch lösen.
Wäre nett von dir wenn du für andere Forum-User deinen Lösungsansatz zumindest andeuten würdest :wink:
 
G

Gelöschtes Mitglied 2635

Gast
Joa, also hab DrawingPanel halt in eine externe Klasse gesteckt, die ich im Hauptprogramm dann instanziere. (Sorry, mein theoretisches Wissen ist noch nicht sonderlich gut, weshalb ich mir schwer tue den Sachverhalt richtig zu beschreiben.) :oops:

Das Programm ist dann soweit fertig, mal abgesehen davon, dass ich bislang keinerlei Ausnahmebehandlung eingebaut habe. Jetzt stellt sich mir aber die Frage, wie ich das Ganze noch in ein Apllet verwandeln kann? Muss eine Applikation und ein Applet abgeben. Wie soll ich vorgehen?

Code:
import java.awt.*;
import java.awt.event.*;

public class TDrawing
	extends Frame
	implements ActionListener, WindowListener, MouseListener, MouseMotionListener {
	
	protected Label lab_circ;
	protected Label lab_area;
	protected TextField txt_index;
	protected TextField txt_radius;
	protected DrawingPanel graphics;
	protected int xm, ym;
	
	public TDrawing() {		
		
		// Fenster einrichten
		Frame wnd = new Frame("TDrawing");
		wnd.setSize(640,480);
		wnd.setVisible(true);
		wnd.setBackground(Color.WHITE);
		wnd.addWindowListener(this);
		
		// Panel 1 einrichten
		graphics = new DrawingPanel();
		graphics.addMouseListener(this);
		graphics.addMouseMotionListener(this);
		
		// Panel 2 einrichten
		Panel menu = new Panel();
		menu.setLayout(new FlowLayout());
		menu.setBackground(Color.LIGHT_GRAY);
		menu.add(new Label("Index: "));
		txt_index = new TextField("0");
		txt_index.addActionListener(this);
		menu.add(txt_index);
		menu.add(new Label("Radius: "));
		txt_radius = new TextField(String.valueOf(graphics.drawing.shapes[0].getA()));
		txt_radius.addActionListener(this);
		menu.add(txt_radius);
		Button btn = new Button("OK");
		btn.addActionListener(this);
		menu.add(btn);
		menu.add(new Label("Umfang: "));
		lab_circ = new Label(String.valueOf(graphics.drawing.shapes[0].circumference()));
		menu.add(lab_circ);
		menu.add(new Label("Flaeche: "));
		lab_area = new Label(String.valueOf(graphics.drawing.shapes[0].area()));
		menu.add(lab_area);		
		
		// Panels zusammenfügen
		wnd.setLayout(new BorderLayout());
		wnd.add(graphics, BorderLayout.CENTER);
		wnd.add(menu, BorderLayout.SOUTH);
		wnd.pack();
	}
	
	public void actionPerformed(ActionEvent event) {
		String cmd = event.getActionCommand();
		if (cmd.equals("OK")) {
			int x = Integer.parseInt(txt_index.getText());
			double r = Double.parseDouble(txt_radius.getText());
			graphics.drawing.shapes[x].setDim(r,r);
			lab_circ.setText(String.valueOf(graphics.drawing.shapes[x].circumference()));
			lab_area.setText(String.valueOf(graphics.drawing.shapes[x].area()));
			graphics.repaint();
		}
	}
	
	public void windowDeactivated(WindowEvent event) {
		
	}
	
	public void windowOpened(WindowEvent event) {

	}
	
	public void windowDeiconified(WindowEvent event) {
		
	}
	
	public void windowClosed(WindowEvent event) {
		
	}
	
	public void windowClosing(WindowEvent event) {
		setVisible(false);
		dispose();
		System.exit(0);
	}
	
	public void windowActivated(WindowEvent event) {

	}
	
	public void windowIconified(WindowEvent event) {
		
	}
	
	public void mouseClicked(MouseEvent event) {
		
	}
	
	public void mousePressed(MouseEvent event) {
		xm = event.getX();
		ym = event.getY();
		for (int i = 0; i < 3; i++) {
			if (graphics.drawing.shapes[i].isMouseInside(event) == true) {
				txt_index.setText(String.valueOf(i));
				txt_radius.setText(String.valueOf(graphics.drawing.shapes[i].getA()));
				lab_circ.setText(String.valueOf(graphics.drawing.shapes[i].circumference()));
				lab_area.setText(String.valueOf(graphics.drawing.shapes[i].area()));
			}
		}
	}
	
	public void mouseReleased(MouseEvent event) {
		
	}
	
	public void mouseExited(MouseEvent event) {
		
	}
	
	public void mouseEntered(MouseEvent event) {
		
	}
	
	public void mouseMoved(MouseEvent event) {
		
	}
	
	public void mouseDragged(MouseEvent event) {
		int i = Integer.parseInt(txt_index.getText());
		graphics.drawing.shapes[i].setPos(xm,ym);
		graphics.drawing.shapes[i].setDim((event.getX()-xm),(event.getY()-ym));
		graphics.repaint();
	}
	
	public static void main(String args[]) {
		TDrawing test = new TDrawing();
	}
	
}

Code:
import java.awt.*;

public class DrawingPanel extends Panel {
    
	protected Drawing drawing;
	
	public DrawingPanel() {
        drawing = new Drawing();
    }
	
    public void paint(Graphics g) {
        drawing.draw(g);
    }
    
}
 

André Uhres

Top Contributor
Code:
/*
 * TDrawing_A.java
 */
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class TDrawing_A extends Applet implements ActionListener, MouseListener, MouseMotionListener{
    protected Label lab_circ;
    protected Label lab_area;
    protected TextField txt_index;
    protected TextField txt_radius;
    protected DrawingPanel graphics;
    protected int xm, ym;
    public void init() {
        try {
            EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    private void initComponents() {
        setLayout(new BorderLayout());
        // Fenster einrichten
        setSize(640,480);
        setVisible(true);
        setBackground(Color.WHITE);
        // Panel 1 einrichten
        graphics = new DrawingPanel();
        graphics.addMouseListener(this);
        graphics.addMouseMotionListener(this);
        // Panel 2 einrichten
        Panel menu = new Panel();
        menu.setLayout(new FlowLayout());
        menu.setBackground(Color.LIGHT_GRAY);
        menu.add(new Label("Index: "));
        txt_index = new TextField("0");
        txt_index.addActionListener(this);
        menu.add(txt_index);
        menu.add(new Label("Radius: "));
        txt_radius = new TextField(String.valueOf(graphics.drawing.shapes[0].getA()));
        txt_radius.addActionListener(this);
        menu.add(txt_radius);
        Button btn = new Button("OK");
        btn.addActionListener(this);
        menu.add(btn);
        menu.add(new Label("Umfang: "));
        lab_circ = new Label(String.valueOf(graphics.drawing.shapes[0].circumference()));
        menu.add(lab_circ);
        menu.add(new Label("Flaeche: "));
        lab_area = new Label(String.valueOf(graphics.drawing.shapes[0].area()));
        menu.add(lab_area);
        // Panels zusammenfügen
        setLayout(new BorderLayout());
        add(graphics, BorderLayout.CENTER);
        add(menu, BorderLayout.SOUTH);
    }
    public void actionPerformed(ActionEvent event) {
        String cmd = event.getActionCommand();
        if (cmd.equals("OK")) {
            int x = Integer.parseInt(txt_index.getText());
            double r = Double.parseDouble(txt_radius.getText());
            graphics.drawing.shapes[x].setDim(r,r);
            lab_circ.setText(String.valueOf(graphics.drawing.shapes[x].circumference()));
            lab_area.setText(String.valueOf(graphics.drawing.shapes[x].area()));
            graphics.repaint();
        }
    }
    public void mouseClicked(MouseEvent e) {}
    public void mousePressed(MouseEvent event) {
        xm = event.getX();
        ym = event.getY();
        for (int i = 0; i < 3; i++) {
//            if (graphics.drawing.shapes[i].isMouseInside(event) == true) {
                txt_index.setText(String.valueOf(i));
                txt_radius.setText(String.valueOf(graphics.drawing.shapes[i].getA()));
                lab_circ.setText(String.valueOf(graphics.drawing.shapes[i].circumference()));
                lab_area.setText(String.valueOf(graphics.drawing.shapes[i].area()));
//            }
        }
    }
    public void mouseReleased(MouseEvent event) {}
    public void mouseEntered(MouseEvent event) {}
    public void mouseExited(MouseEvent event) {}
    public void mouseDragged(MouseEvent event) {
        int i = Integer.parseInt(txt_index.getText());
        graphics.drawing.shapes[i].setPos(xm,ym);
        graphics.drawing.shapes[i].setDim((event.getX()-xm),(event.getY()-ym));
        graphics.repaint();
    }
    public void mouseMoved(MouseEvent e) {}
}
 
G

Gelöschtes Mitglied 2635

Gast
Vielen herzlichen Dank für die Mühe. :toll:
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben