Java AWT- Probleme beim zeichnen

JAVAx

Grünschnabel
Hallo Freunde,

es geht darum das ich ein Balkendiagramm zeichnen möchte. Die Daten werden aus einem Array ausgelesen und reingeschrieben. Mein Problem besteht darin, dass ich immer nur ein Balkendiagramm zeichnen kann. Es wird also eins gezeichnet dann eine Zeile unter wird eine neue gezeichnet und das andere aber wieder gelöscht. Gibt es außer der repaint methode vielleicht noch etwas anderes? Irgendeiner ne Idee?

Ich muss das ganze mit AWT lösen Swing ist nicht erlaubt!

Java:
class Schueler extends Frame{
	private Model m_Mod;
	int[] a;
	int b=0;
	int j=0;
	
	Schueler(Model mMod){
		this.m_Mod = mMod;
		setVisible(true);
		setSize(900,400);
		a= m_Mod.schueler.Histogramm_Alter();

		int i=0;
		while(i!=a.length-1){
			try {
				if(a[i]>0){
					Thread.sleep(20);
//					repaint(50,b+30,400,900);
					System.out.println(a[i]);
					repaint();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			b+=50;
			++i;
		}
	}
	
	@Override
	public void paint(Graphics g){
		g.setColor(Color.red);
		g.fillRect(50,b+50,50,50);
	}
}

Vielen Dank für eure Mühe
JavaX
 
Zuletzt bearbeitet:
Wie wäre es, für jeden Balken ein neues Objekt zu erzeugen, und die dann alle in einen Frame packen? das reduziert zumindest einige Fehlerquellen.

Und noch etwas (zeile 17 in deinem Code):
Du solltest den AWT-Event-Thread niemals schlafen legen, denn in der Zeit kann er keine Events empfangen, damit ist die verarbeitung von z.B. resize-events, Mausklicks, Tastatureingaben ausgeschlossen. Und repaint() funktioniert nicht unbedingt ordnungsgemäß.
 
Ja gibt es, in dem du nicht von Frame ableitest sondern von Panel. Du zeichnest halt jedes Diagramm auf ein eigenes Panel ... diese fügst du dann nachher nur noch den Vorgaben entsprechend mit einem Layout-Manager ins Frame ein.

//EDIT
PS : erlaube mir bitte die Frage : WER zum Henker gibt dir vor NICHT mit Swing zu arbeiten ? Das ist nun wirklich nicht mehr Zeitgemäß. Ich denke da will sich nur jemand die Mühe sparen und seine alten Aufzeichnungen an ein neues System anzupassen*
 
@SPiKEe
Es ist egal, ob etwas zeitgemäß ist oder nicht, Vorgabe ist Vorgabe und daran muss man sich halten. Es gibt auch immer noch Systeme, die in Java 1.4 (sicherlich auch noch ältere) geschrieben und immer noch produktiv im Einsatz sind und man das aus bestimmten Gründen nicht ändern will. Genauso auch mit anderen Sprachen, ein ziemlich großer Teil der Software auf Unixservern ist Uraltcode, der aber immer noch produktiv im Einsatz ist.
 
das ist für die uni gedacht ... :))

wir haben bisher nicht mit swing gearbeitet ... kommt noch ! Panel ist vielleicht auch eine gute Idee... habe es mir grad angesehen... ist es denn vielleicht auch anders zu lösen ? man kann mit repaint die neuen zeichen bereiche angeben... das klappt bei mri aber nicht...
 
Warum willst du Bereiche angeben, die neu gezeichnet werden sollen? Erzeuge einfach für jeden Balken in deinem Balkendiagramm eine neue Instanz von einer Klasse, die z.B. von Panel oder Canvas erbt. Dann kannst du auch einzelne Balken neu zeichen.
 
Ich empfehle dir, deinen Code nochmal in tags zu setzen, damit er besser gelesen werden kann. Diese weise mag man hier im Forum nicht!
 
Ja, ich wusste, nur nicht wie.
Hier mein neuer Code, noch nicht perfekt aber besser.
Info: Grundstruktur aus dem Internet kopiert, Rest selber gemacht
Code:
import java.awt.*;
import java.awt.event.*;

class ZeigerOrt extends Frame implements MouseListener
{
	TextField tf;
	int x1,y1,x2,y2,x3,y3,x4,y4;
	int i=0;
	
	ZeigerOrt()
	{
		setSize(600,600);
		setTitle("Punkt Koordinaten!");
		setBackground(Color.gray);
		setLayout(null);
	
		tf= new TextField("");
		tf.setBounds(40,60,300,20);
		tf.setBackground(Color.lightGray);
		//tf.addMouseListener(this);
		add(tf);
	
		addMouseListener(this);
	
		setVisible(true);
	}

	public void mouseClicked(MouseEvent m)
	{
		if(m.getClickCount()==1)
		
		i=i+m.getClickCount();
		
		if(i==1 || (i%4==1))
		{
			x1 = m.getX();
			y1 = m.getY();
		}
		if(i==2 || (i%4==2))
		{
			x2 = m.getX();
			y2 = m.getY();
		}
		if(i==3 || (i%4==3))
		{
			x3 = m.getX();
			y3 = m.getY();
		}
		if(i%4==0)
		{
			x4 = m.getX();
			y4 = m.getY();
		}
		tf.setText("P1:"+x1+" "+y1+" P2:"+x2+" "+y2+" P3:"+x3+" "+y3+" P4:"+x4+" "+y4+"  "+i);	
		System.out.println(m+"  "+i);
	}

	public void mouseEntered(MouseEvent a){}
	public void mouseExited(MouseEvent b){}
	public void mousePressed(MouseEvent c){}
	public void mouseReleased(MouseEvent d){}

	public void paint(Graphics g)
	{
		g.drawLine(x1, y1, x2, y2);
		g.drawLine(x3, y3, x4, y4);
		g.setColor(Color.black);
		setVisible(true);
		repaint();
	}
	public static void main (String a[])
	{
		ZeigerOrt z = new ZeigerOrt();
	}

}
Mein Problem ist jetzt nur, dass ich es nicht hin bekomme, dass der Strich auch da ansetzt, wo ich mit der Maus hinklicke, sondern wenn ich den ersten Klick mache, zeichnet er den Strich aus dem Nullpunkt zum ersten Klick
 
Zuletzt bearbeitet:
Du musst jeweils die Position des vorangegangenen Klicks speichern, da du ja von einem Punkt (1. Klick) zum anderen Punkt (2. Klick) zeichnen möchtest.
 
Hab es hinbekommen. Jetzt soll aber Parallel dazu ein Ball fallen. Ich habe ein Thread gemacht, das kann ich aber nicht benutzen, da ja auch noch zeichnen möchte und der Computer kann durch das Thread eben dies nicht gleichzeitig.
Nun wollte ich ein Timer einbauen, aber ich muss zugeben, dass ich nicht weiss, wie das funktioniert bzw. ich nicht weiss, wie ich ihn in folgendem code einbinden kann:
Code:
import java.awt.*;
import java.awt.event.*;

class ZeigerOrt extends Frame implements MouseListener
{
	TextField tf;
	int x1,y1,x2,y2,x3,y3,x4,y4;
	int i=0;
	
	
	ZeigerOrt()
	{
		setSize(600,600);
		setTitle("Punkt Koordinaten!");
		setBackground(Color.gray);
		setLayout(null);
	
		tf= new TextField("");
		tf.setBounds(40,60,300,20);
		tf.setBackground(Color.lightGray);
		//tf.addMouseListener(this);
		add(tf);
	
		addMouseListener(this);
	
		setVisible(true);
	}

	public void mouseClicked(MouseEvent m)
	{
//		x2=x1;
//		y2=y1;
		//x4=x3;
		//y4=y3;
		if(m.getClickCount()==1)
		
		i=i+m.getClickCount();
		
		if(i==1 || (i%4==1))
		{
			x1 = m.getX();
			y1 = m.getY();
		}
		if(i==2 || (i%4==2))
		{
			x2 = m.getX();
			y2 = m.getY();
		}
		if(i==3 || (i%4==3))
		{
			x3 = m.getX();
			y3 = m.getY();
		}
		if(i%4==0)
		{
			x4 = m.getX();
			y4 = m.getY();
		}
		tf.setText("P1:"+x1+" "+y1+" P2:"+x2+" "+y2+" P3:"+x3+" "+y3+" P4:"+x4+" "+y4+"  "+i);	
		System.out.println(m+"  "+i);
	}

	public void mouseEntered(MouseEvent a){}
	public void mouseExited(MouseEvent b){}
	public void mousePressed(MouseEvent c){}
	public void mouseReleased(MouseEvent d){}

	public void paint(Graphics g)
	{
		if ((i==2)||(i==3)||(i%4==2)||(i%4==3))
		  {g.drawLine(x1, y1, x2, y2);}
		if ((i==4)||(i%4==0)||(i%4==1))
		  {g.drawLine(x3, y3, x4, y4);}
		
		g.setColor(Color.black);
		repaint();
		
		for (int y10=20; y10<=470; y10++)
        {
//        	try
//        	{
//        		Thread.sleep(10);
//        	}
//        	catch(InterruptedException x){}        		        	
//			javax.swing.Timer t = new javax.swing.Timer( 1000, new ActionListener() {
//				  public void actionPerformed( ActionEvent e ) {
//				    g.repaint();}
//				  }
//			g.clearRect(100, y10-1, 20, 20);
//        	g.fillOval(100,y10,20,20);      
//        	g.setColor(new Color(255, 0, 0));
        	        	 
        }
	}
	

	public static void main (String a[])
	{
		ZeigerOrt z = new ZeigerOrt();
	}

}
 

Neue Beiträge

Zurück