# Problem mit Antialiasing



## ghost_hacker (6. Dez 2010)

Hi Leute!

Ich muss für die Schule in Partnerarbeit ein kleines Applet programmieren, das eine Digitaluhr, eine Analoguhr und einen Wecker beinhaltet. Mein Partner hat die Digitaluhr gemacht und ich die Analoguhr - hat auch bei jedem von uns problemlos funktioniert (den Wecker müssen wir noch). Als wir die Programme jedoch zusammenführen wollten, funktioniert nur eine Uhr und er wirft eine NullPointerException raus - und ich hab keine Ahnung, wieso. Wäre nett, wenn mir ihr da bei der Fehlersuche helfen könntet.

Hier ist der Code (kleiner Hinweis: die ersten 3 Textfelder sind für Eingabe von Stunde/Minute/Sekunde):


```
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class uhr4 extends Applet
implements ActionListener
{
	private int stunde, minute, sekunde, stunde_wecker, minute_wecker;
	private TextField stunde_text, minute_text, sekunde_text, stunde_wecker_text, minute_wecker_text;
	private Button uhr_anzeigen, uhr_starten, uhr_stoppen, wecker_starten, wecker_stoppen;
	private analoguhr tictac;
	private Digitaluhr Digitalanzeige;
	private Graphics j;
	private AudioClip clockticking, weckersorgen;
	private wecker alarm;
	
	public void init()
	{
		clockticking = getAudioClip(getDocumentBase(), "clockticking.wav");
		weckersorgen = getAudioClip(getDocumentBase(), "wecker.wav");
		
		Graphics j = getGraphics();
		tictac = new analoguhr(j);
		Digitalanzeige = new Digitaluhr();
		
		stunde_text = new TextField(2);
		add(stunde_text);
		stunde_text.addActionListener(this);
		
		minute_text = new TextField(2);
		add(minute_text);
		minute_text.addActionListener(this);
		
		sekunde_text = new TextField(2);
		add(sekunde_text);
		sekunde_text.addActionListener(this);
		
		stunde_wecker_text = new TextField(2);
		add(stunde_wecker_text);
		stunde_wecker_text.addActionListener(this);
		
		minute_wecker_text = new TextField(2);
		add(minute_wecker_text);
		minute_wecker_text.addActionListener(this);
		
		uhr_anzeigen = new Button("Anzeigen");
		add(uhr_anzeigen);
		uhr_anzeigen.addActionListener(this);
		
		uhr_starten = new Button("Start");
		add(uhr_starten);
		uhr_starten.addActionListener(this);
		
		uhr_stoppen = new Button("Stop");
		add(uhr_stoppen);
		uhr_stoppen.addActionListener(this);
		
		wecker_starten = new Button("Wecker-Start");
		add(wecker_starten);
		wecker_starten.addActionListener(this);
		
		wecker_stoppen = new Button("Wecker-Stop");
		add(wecker_stoppen);
		wecker_stoppen.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent event)
	{
		if(event.getSource() == uhr_anzeigen)
		{
			stunde = Integer.parseInt (stunde_text.getText());
			minute = Integer.parseInt (minute_text.getText());
			sekunde = Integer.parseInt (sekunde_text.getText());
					
			tictac.datenübergabe(stunde, minute, sekunde, clockticking);
			tictac.anzeigen();
			
			Digitalanzeige.datenübergabe(stunde,minute,sekunde,j);
			Digitalanzeige.anzeigen();
		}
		
		if(event.getSource() == uhr_starten)
		{
			tictac.start();			
			Digitalanzeige.start();
		}
		
		if(event.getSource() == uhr_stoppen)
		{
			tictac.anhalten();
			Digitalanzeige.anhalten();
		}
	}	
}	


class analoguhr extends Thread
{
	private Graphics g;
	private int zentrum, radius;
	private int stunde, minute, sekunde;
	private boolean running;
	private AudioClip clockticking;
	
	public analoguhr(Graphics temp)
	{
		g = temp;
		
		zentrum = 400;
		radius = 100;

	}
	
	public void datenübergabe(int stunde_temp, int minute_temp, int sekunde_temp, AudioClip clockticking_temp)
	{
		stunde = stunde_temp;
		minute = minute_temp;
		sekunde = sekunde_temp;
		clockticking = clockticking_temp;
	}
	
	public void anzeigen()
	{
		g.setColor(Color.white);
		g.fillRect(zentrum-radius, zentrum-radius, 2*radius, 2*radius);
		g.setColor(Color.black);
		g.drawOval(zentrum-2, zentrum-2,4,4);
		
		//Viertelstriche
		for (int i = 0; i < 4; i++)
		{
			g.drawLine(zentrum + (int) ((radius-7)*Math.cos(Math.toRadians(90*i))), zentrum + (int) ((radius-7)*Math.sin(Math.toRadians(90*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(90*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(90*i))));
		}
		
		//Stundenstriche
		for (int i = 0; i < 12; i++)
		{
			g.drawLine(zentrum + (int) ((radius-5)*Math.cos(Math.toRadians(30*i))), zentrum + (int) ((radius-5)*Math.sin(Math.toRadians(30*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(30*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(30*i))));
		}
		
		//Minutenstriche
		for(int i = 0; i < 60; i++)
		{
			g.drawLine(zentrum + (int) ((radius-2)*Math.cos(Math.toRadians(6*i))), zentrum + (int) ((radius-2)*Math.sin(Math.toRadians(6*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(6*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(6*i))));
		}
		
		//Stundenzeiger
		g.drawLine(zentrum, zentrum, zentrum + (int) (60*Math.cos(Math.toRadians(stunde%12*30+minute/2.0-90))), zentrum + (int) (60*Math.sin(Math.toRadians(stunde%12*30+minute/2.0-90))));
		
		//Minutenzeiger
		g.drawLine(zentrum, zentrum, zentrum + (int) (85*Math.cos(Math.toRadians(minute*6-90))), zentrum + (int) (85*Math.sin(Math.toRadians(minute*6-90))));
		
		//Sekundenzeiger
		g.setColor(Color.gray);
		g.drawLine(zentrum, zentrum, zentrum + (int) (90*Math.cos(Math.toRadians(sekunde*6-90))), zentrum + (int) (90*Math.sin(Math.toRadians(sekunde*6-90))));
	}
	
	public void run()
	{

		running = true;
		while(running)
		{
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException ie )
			{
				System.err.print("Fehler!");
			}
			
			clockticking.play();
		
			if(sekunde<60)
			{
				sekunde++;
				if(sekunde==60)
				{
					sekunde=0;
					minute++;
					if(minute==60)
					{
						minute=0;
						stunde++;
						if(stunde==24)
						{
							stunde=0;
						}
					}
				}
			}
			
			anzeigen();
		}
	}
	
	public void anhalten()
	{
		running = false;
	}
}

class Digitaluhr extends Thread

{
	private Graphics g;
	private int stunde,minute,sekunde;
	private boolean b;

	Font myFont = new Font("Arial", Font.ITALIC|Font.PLAIN, 60);

	public Digitaluhr ()
	{
	}
	
	public void datenübergabe(int stunde_a,int minute_a,int sekunde_a,Graphics j)
	{
		stunde=stunde_a;
		minute=minute_a;
		sekunde=sekunde_a;
		g=j;
	}
	public void anzeigen ()
	{
			g.setFont(myFont);
			g.setColor(Color.white);
			g.fillRect(0,0,500,100);
			g.setColor(Color.black);
		if(stunde<24) if(stunde>=0) if(minute<60) if(minute>=0) if(sekunde<60) if(sekunde>=0)
		{
			g.drawString(""+stunde,125,100);
			g.drawString(":"+minute,190,100);
			g.drawString(":"+sekunde,270,100);
		}
	}
	public void run()
	{
		b=true;
		while(b)
		{
				try
				{
					Thread.sleep(1000);
				}
				catch (InterruptedException ie )
				{
					System.err.print("Fehler!");
				}
		
		if(sekunde<60)
		{
			sekunde++;
			if(sekunde==60)
			{
				sekunde=0;
				minute++;
				if(minute==60)
				{
					minute=0;
					stunde++;
					if(stunde==24)
					{
						stunde=0;
					}
				}
			}
			}
			g.setColor(Color.white);
			
			g.fillRect(0,0,500,100);
			g.setColor(Color.black);
		if(stunde<24) if(stunde>=0) if(minute<60) if(minute>=0) if(sekunde<60) if(sekunde>=0)
		{
			g.setFont(myFont);
			g.drawString(""+stunde,125,100);
			g.drawString(":"+minute,190,100);
			g.drawString(":"+sekunde,270,100);
			
		}		
		}
		
	}
	public void anhalten()
	{
		b=false;
	}

}

class wecker extends Thread
{
	public wecker()
	{
	}
	
	public void klingeln()
	{
	}
	
	public void klingeln_stop()
	{
	}
}
```


----------



## Gast2 (6. Dez 2010)

> Als wir die Programme jedoch zusammenführen wollten, funktioniert nur eine Uhr und er wirft eine NullPointerException raus - und ich hab keine Ahnung, wieso.


In welcher Zeile? Oder sollen wir raten?


----------



## ghost_hacker (6. Dez 2010)

ne spezifische Zeile gibt er nicht an, nur mehrere^^.

Das hier ist die Fehlermeldung:


```
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
	at Digitaluhr.anzeigen(uhr4.java:226)
	at uhr4.actionPerformed(uhr4.java:79)
	at java.awt.Button.processActionEvent(Button.java:392)
	at java.awt.Button.processEvent(Button.java:360)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```

//edit: falls es jemandem hilft: wir programmieren mit RealJ


----------



## Gast2 (6. Dez 2010)

Also:
Zum einen steht die Zeile sehr wohl dort:
	
	
	
	





```
at uhr4.actionPerformed(uhr4.java:75)
```
und zum anderen ist das keine NullPointerException 
EDIT: _Post über mir wurde editiert_

Wo genau das Problem allerdings liegt weiß ich nicht, bin in Applets nicht so versiert.
In der Fehlermeldung steht allerdings 
	
	
	
	





```
analoguhr.datenübergabe(IIILjava/applet/AudioClip;)
```
, kanns sein dass du noch irgendwelche alten Dateien verwendest wo der Methodenaufruf noch anders war?


----------



## ghost_hacker (6. Dez 2010)

sry, eike, hatte kurz die falsche fehlermeldung reingestellt, das mit dem audioclip ist schon länger behoben - jetzt steht die richtige drin.


----------



## SlaterB (6. Dez 2010)

@EikeB wieso ist die NullPointerException keine NullPointerException und wo hast du die Zeile
> analoguhr.datenübergabe(IIILjava/applet/AudioClip; )
her, hat ghost_hacker sein Posting zwischendurch editiert?
edit: ok 

--------

der Fehler ist wahrscheinlich, dass das Graphics-Objekt null ist, welches anfangs mit getGraphics() geholt wurde,
NIE getGraphics() irgendwo aufrufen, schon ist ein Programm an sich erstmal besser

wie kommt man an Graphics ran?
nur durch Überschreiben von paint-Methoden die vom System automatisch mit dem richtigen Graphics-Objekt aufgerufen werden

vor komplizierten Applets besser erstmal in normaleren Swing-Anwendungen Zeichnen üben
http://www.java-forum.org/awt-swing-swt/43939-zeichnen-swing-tutorial.html


----------



## Gast2 (6. Dez 2010)

> @EikeB wieso ist die NullPointerException keine NullPointerException und wo hast du die Zeile
> > analoguhr.datenübergabe(IIILjava/applet/AudioClip
> her, hat ghost_hacker sein Posting zwischendurch editiert?


Ja er hats editiert, und ich steh jetzt doof da :bae:


----------



## ghost_hacker (6. Dez 2010)

öhm, danke erstmal, SlaterB, ich bin allerdings, was java angeht, ein ziemlicher anfänger und hab keine ahnung vom überschreiben von methoden .

wenn du mir das kurz erklären könntest, so dass ich das umsetzen kann, wäre ich dir sehr dankbar - wibei ich allerdings auch nicht ganz verstehe, wieso der graphikkontext null sein soll - normalerweise müsste er vernünftig zugewiesen sein.

//edit: SlaterB, du bist der beste, dank deinem hinweis mit dem graphikkontext hab ich es zum laufen gekriegt . der fehler lag wohl darin, dass der graphikkontext j nach dem übergeben auf null gesetzt wurde - wie du auch gesagt hast, deshalb hab ich einfach nen zweiten graphikkontext erstellt, so dass an jede class jetzt ein verschiedener graphikkontext übergeben wird - damit klappt es dann.


----------



## Gast2 (6. Dez 2010)

Den geposteten Link hast du dir nicht durchgelesen oder? 
Wenn du das gelesen und verstanden hast sollte eig. recht klar sein wie du deinem Code umbauen solltest.


----------



## ghost_hacker (6. Dez 2010)

EikeB, um ehrlich zu sein: nein, ich hab mir nicht das ganze tutorial durchgelesen, vllt werd ich das demnächst mal machen, aber vorerst bin ich froh, dass das programm läuft - trotz getGraphics. Auf die Idee, dass das am Grafikkontext liegen könnte, wär ich nie gekommen - danke nochmal, SlaterB


----------



## Gast2 (6. Dez 2010)

> Auf die Idee, dass das am Grafikkontext liegen könnte, wär ich nie gekommen


Joa, solche Sachen lernt man auch nur wenn man sich damit beschäftigt und Tutorials durcharbeitet


----------



## ghost_hacker (6. Dez 2010)

da hast du höchstwahrscheinlich recht - aber ich knabbere im mom noch an meinem kofler über linux, den lies ich mir erstmal durch, bevor ich mit anderen tutorials anfange


----------



## SlaterB (6. Dez 2010)

und wenn wieder was nicht geht wirds das Forum schon beantworten..


----------



## ghost_hacker (6. Dez 2010)

Hey Leute!

Dank SlaterB bin ich jetzt um einiges weitergekommen und hab mein Programm eigentlich schon fertig. Als ich dann jedoch zum Schluss Antialiasing einfügen wollte, ist mir aufgefallen, dass einige Sachen gar nicht mehr angezeigt werden, ohne Antialiasing funktioniert es jedoch - könnte mir da evtl. jemand einen Rat geben?

Hier ist der Code (bei den Sachen, die nicht mehr angezeigt werden, handelt es sich um Zeile 162-172 und Zeile 239-246):


```
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class uhr6 extends Applet
implements ActionListener
{
	private int stunde, minute, sekunde, stunde_wecker, minute_wecker, sekunde_wecker;
	private TextField stunde_text, minute_text, sekunde_text, stunde_wecker_text, minute_wecker_text, sekunde_wecker_text;
	private Button uhr_anzeigen, uhr_starten, uhr_stoppen, wecker_starten, wecker_stoppen, wecker_schlafen;
	private analoguhr tictac;
	private Digitaluhr Digitalanzeige;
	private Graphics2D j, h;
	private AudioClip clockticking, weckersorgen;
	private wecker alarm;
	private boolean weckerklingelt;
	
	public void init()
	{
		clockticking = getAudioClip(getDocumentBase(), "clockticking.wav");
		weckersorgen = getAudioClip(getDocumentBase(), "wecker.wav");
		
		alarm = new wecker(weckersorgen);
		
		j = (Graphics2D) getGraphics();
		h = (Graphics2D) getGraphics();
		tictac = new analoguhr(j);
		Digitalanzeige = new Digitaluhr();
		
		stunde_text = new TextField(2);
		add(stunde_text);
		stunde_text.setText("Stunde");
		stunde_text.selectAll();
		
		minute_text = new TextField(2);
		add(minute_text);
		minute_text.setText("Minute");
		minute_text.selectAll();
		
		sekunde_text = new TextField(2);
		add(sekunde_text);
		sekunde_text.setText("Sekunde");
		sekunde_text.selectAll();
		
		stunde_wecker_text = new TextField(2);
		add(stunde_wecker_text);
		stunde_wecker_text.setText("Stunde");
		stunde_wecker_text.selectAll();
		
		minute_wecker_text = new TextField(2);
		add(minute_wecker_text);
		minute_wecker_text.setText("Minute");
		minute_wecker_text.selectAll();
		
		sekunde_wecker_text = new TextField(2);
		add(sekunde_wecker_text);
		sekunde_wecker_text.setText("Sekunde");
		sekunde_wecker_text.selectAll();
		
		uhr_anzeigen = new Button("Anzeigen");
		add(uhr_anzeigen);
		uhr_anzeigen.addActionListener(this);
		
		uhr_starten = new Button("Start");
		add(uhr_starten);
		uhr_starten.addActionListener(this);
		
		uhr_stoppen = new Button("Stop");
		add(uhr_stoppen);
		uhr_stoppen.addActionListener(this);
		
		wecker_starten = new Button("Start");
		add(wecker_starten);
		wecker_starten.addActionListener(this);
		
		wecker_stoppen = new Button("Stop");
		add(wecker_stoppen);
		wecker_stoppen.addActionListener(this);
		
		wecker_schlafen = new Button("Schlafen");
		add(wecker_schlafen);
		wecker_schlafen.addActionListener(this);
		
		setLayout(null);
		stunde_text.setBounds(20,20,60,20);
		minute_text.setBounds(20,50,60,20);
		sekunde_text.setBounds(20,80,60,20);
		uhr_anzeigen.setBounds(90,20,60,20);
		uhr_starten.setBounds(90,50,60,20);
		uhr_stoppen.setBounds(90,80,60,20);
		stunde_wecker_text.setBounds(420,20,60,20);
		minute_wecker_text.setBounds(420,50,60,20);
		sekunde_wecker_text.setBounds(420,80,60,20);
		wecker_starten.setBounds(350,20,60,20);
		wecker_stoppen.setBounds(350,50,60,20);
		wecker_schlafen.setBounds(350,80,60,20);
	}
	
	public void actionPerformed(ActionEvent event)
	{
		if(event.getSource() == uhr_anzeigen)
		{
			stunde = Integer.parseInt (stunde_text.getText());
			minute = Integer.parseInt (minute_text.getText());
			sekunde = Integer.parseInt (sekunde_text.getText());
					
			tictac.datenübergabe(stunde, minute, sekunde, clockticking);
			tictac.anzeigen();
			
			Digitalanzeige.datenübergabe(stunde,minute,sekunde,h);
			Digitalanzeige.anzeigen();
		}
		
		if(event.getSource() == uhr_starten)
		{
			tictac.start();			
			Digitalanzeige.start();
		}
		
		if(event.getSource() == uhr_stoppen)
		{
			tictac.anhalten();
			Digitalanzeige.anhalten();
		}
		
		if(event.getSource() == wecker_starten)
		{
			stunde_wecker = Integer.parseInt (stunde_wecker_text.getText());
			minute_wecker = Integer.parseInt (minute_wecker_text.getText());
			sekunde_wecker = Integer.parseInt (sekunde_wecker_text.getText());
			
			weckerklingelt = false;
			
			while(!weckerklingelt)
			{
				if(stunde_wecker == stunde && minute_wecker == minute && sekunde_wecker == sekunde)
				{
					weckerklingelt = true;
					alarm.klingeln();
				}
				
				else
				{
					stunde = tictac.rückgabe_stunde(stunde);
					minute = tictac.rückgabe_minute(minute);
					sekunde = tictac.rückgabe_sekunde(sekunde);
				}
			}
		}
		
		if(event.getSource() == wecker_stoppen)
		{
			alarm.klingeln_stop();
		}
		
		if(event.getSource() == wecker_schlafen)
		{
			alarm.schlafen();
		}
	}
	
	public void paint(Graphics2D g)
	{
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		g.drawLine(250,20,250,100);
		Font beschreibung = new Font("Arial", Font.PLAIN, 20);
		g.setFont(beschreibung);
		
		g.drawString("Uhr", 210,70);
		g.drawString("Wecker", 260,70);
	}
}	

class analoguhr extends Thread
{
	private Graphics2D g;
	private int zentrum, radius;
	private int stunde, minute, sekunde;
	private boolean running;
	private AudioClip clockticking;
	
	public analoguhr(Graphics2D temp)
	{
		g = temp;
		
		zentrum = 250;
		radius = 100;
	}
	
	public void datenübergabe(int stunde_temp, int minute_temp, int sekunde_temp, AudioClip clockticking_temp)
	{
		stunde = stunde_temp;
		minute = minute_temp;
		sekunde = sekunde_temp;
		clockticking = clockticking_temp;
	}
	
	public void anzeigen()
	{
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		g.setColor(Color.white);
		g.fillRect(zentrum-radius, zentrum-radius, 2*radius, 2*radius);
		if(stunde<24) if(stunde>=0) if(minute<60) if(minute>=0) if(sekunde<60) if(sekunde>=0)
		{
			g.setColor(Color.black);
			g.drawOval(zentrum-2, zentrum-2,4,4);
		
			//Viertelstriche
			for (int i = 0; i < 4; i++)
			{
				g.drawLine(zentrum + (int) ((radius-7)*Math.cos(Math.toRadians(90*i))), zentrum + (int) ((radius-7)*Math.sin(Math.toRadians(90*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(90*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(90*i))));
			}
		
			//Stundenstriche
			for (int i = 0; i < 12; i++)
			{
				g.drawLine(zentrum + (int) ((radius-5)*Math.cos(Math.toRadians(30*i))), zentrum + (int) ((radius-5)*Math.sin(Math.toRadians(30*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(30*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(30*i))));
			}
		
			//Minutenstriche
			for(int i = 0; i < 60; i++)
			{
				g.drawLine(zentrum + (int) ((radius-2)*Math.cos(Math.toRadians(6*i))), zentrum + (int) ((radius-2)*Math.sin(Math.toRadians(6*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(6*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(6*i))));
			}
		
			//Stundenzeiger
			g.drawLine(zentrum, zentrum, zentrum + (int) (60*Math.cos(Math.toRadians(stunde%12*30+minute/2.0-90))), zentrum + (int) (60*Math.sin(Math.toRadians(stunde%12*30+minute/2.0-90))));
		
			//Minutenzeiger
			g.drawLine(zentrum, zentrum, zentrum + (int) (85*Math.cos(Math.toRadians(minute*6-90))), zentrum + (int) (85*Math.sin(Math.toRadians(minute*6-90))));
		
			//Sekundenzeiger
			g.setColor(Color.gray);
			g.drawLine(zentrum, zentrum, zentrum + (int) (90*Math.cos(Math.toRadians(sekunde*6-90))), zentrum + (int) (90*Math.sin(Math.toRadians(sekunde*6-90))));
		}
		
		else
		{
			Font fehlermeldung = new Font("Arial", Font.PLAIN, 40);
			g.setFont(fehlermeldung);
			g.setColor(Color.red);
			
			g.drawString("Error 99: User IQ underflow!", 20, 200);
		}
	}
	
	public void run()
	{
		running = true;
		while(running)
		{
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException ie )
			{
				System.err.print("Fehler!");
			}
			
			if(stunde<24) if(stunde>=0) if(minute<60) if(minute>=0) if(sekunde<60) if(sekunde>=0)
			{
				clockticking.play();
			}
		
			if(sekunde<60)
			{
				sekunde++;
				if(sekunde==60)
				{
					sekunde=0;
					minute++;
					if(minute==60)
					{
						minute=0;
						stunde++;
						if(stunde==24)
						{
							stunde=0;
						}
					}
				}
			}
			
			anzeigen();
		}
	}
	
	public void anhalten()
	{
		running = false;
	}
	
	public int rückgabe_stunde(int stunde_temp)
	{
		stunde_temp = stunde;
		return stunde_temp;
	}
	
	public int rückgabe_minute(int minute_temp)
	{
		minute_temp = minute;
		return minute_temp;
	}
	
	public int rückgabe_sekunde(int sekunde_temp)
	{
		sekunde_temp = sekunde;
		return sekunde_temp;
	}
}

class Digitaluhr extends Thread

{
	private Graphics2D g;
	private int stunde,minute,sekunde;
	private boolean running;
	private String h, m, sec;

	Font digital = new Font("Arial", Font.ITALIC|Font.PLAIN, 60);

	public Digitaluhr ()
	{
	}
	
	public void datenübergabe(int stunde_a,int minute_a,int sekunde_a,Graphics2D temp)
	{
		stunde=stunde_a;
		minute=minute_a;
		sekunde=sekunde_a;
		g=temp;
	}
	
	public void anzeigen ()
	{
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		g.setFont(digital);
		g.setColor(Color.white);
		g.fillRect(0,360,500,140);
		g.setColor(Color.black);
		
		if(stunde<24) if(stunde>=0) if(minute<60) if(minute>=0) if(sekunde<60) if(sekunde>=0)
		{
  			if(stunde<10) 
  			{
   			h="0"+String.valueOf(stunde);
  			}
  			else 
  			{
   			h=String.valueOf(stunde);  
  			}
  			if(minute<10)
  			{
  				m="0"+String.valueOf(minute);
  			}
  			else
  			{
   			m=String.valueOf(minute); 
  			}
  			if(sekunde<10)
  			{
   			sec="0"+String.valueOf(sekunde);
  			}
  			else
  			{
   			sec=String.valueOf(sekunde);
  			}
			g.drawString(""+h,135,450);
			g.drawString(":"+m,200,450);
			g.drawString(":"+sec,280,450);
		}
	}
	
	public void run()
	{
		running=true;
		while(running)
		{
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException ie )
			{
				System.err.print("Fehler!");
			}
		
			if(sekunde<60)
			{
				sekunde++;
				if(sekunde==60)
				{
					sekunde=0;
					minute++;
					if(minute==60)
					{
						minute=0;
						stunde++;
						if(stunde==24)
						{
							stunde=0;
						}
					}
				}
			}
			
			anzeigen();		
		}
	}
	
	public void anhalten()
	{
		running=false;
	}
}

class wecker
{
	private AudioClip weckersorgen;
	private boolean ringing;
	
	public wecker(AudioClip weckersorgen_temp)
	{
		weckersorgen = weckersorgen_temp;
	}
	
	public void klingeln()
	{
		weckersorgen.loop();
	}
	
	public void klingeln_stop()
	{
		weckersorgen.stop();
	}
	
	public void schlafen()
	{
		weckersorgen.stop();
		 
		long t0, t1;

      t0 =  System.currentTimeMillis();

      do{
          t1 = System.currentTimeMillis();
      }
      while ((t1 - t0) < (10 * 1000));
      
      weckersorgen.loop();		
	}
}
```

Vielen Dank
ghost_hacker


----------



## SlaterB (6. Dez 2010)

du bist dir sicher dass es wieder geht, wenn du z.B. nur genau Zeile 164 auskommentierst?

der Unterschied Graphics vs Graphics2D erscheint mir viel wichtiger,
z.B. ist paint(Graphics g) eine extrem wichtige Methode von Applet, die man richtigerweise überschreiben sollte um selber zu malen

paint(Graphics2D g) ist dagegen komplett was anderes, eine selber definiere Methode für die sich das Applet nicht interessiert,
die Methode wird von dir selber anscheinend nicht aufgerufen


----------



## ghost_hacker (6. Dez 2010)

ne, es geht, wenn ich zeile 164 auskommentiere und aus dem Graphics2D ein Graphics mache, und um ehrlich zu sein, ist das neuland für mich und ich kenn mich da nicht sehr gut aus. bei paint ist mir das antialiasing auch noch egal, aber bei anzeigen() der analoguhr muss das unbedingt mit rein, da wird aber jetzt die fehlermeldung nicht angezeigt


----------



## ghost_hacker (6. Dez 2010)

bei paint hab ich das jetzt behoben - war auch relativ einfach, nachdem du mir den fehler verraten hattest...


```
public void paint(Graphics g)
	{
		Graphics2D j = (Graphics2D) g;
		j.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		j.drawLine(250,20,250,100);
		Font beschreibung = new Font("Arial", Font.PLAIN, 20);
		j.setFont(beschreibung);
		
		j.drawString("Uhr", 210,70);
		j.drawString("Wecker", 260,70);
	}
```


----------



## SlaterB (6. Dez 2010)

tja, eine unangenehme Behauptung wäre jetzt, dass das mit dem sowieso schlechten getGraphics()-Weg nicht geht,
beschwören kann ich es nicht aber wäre verrückt da jetzt Zeit reinzustecken

und der Umbau ist gar nicht schwer, die Threads müssen beizeiten nur repaint() am Applet-Objekt aufrufen, 
dann kommt die paint-Methode mit sauberen Graphics-Objekt dran, dieses nutzen um bei anderen Methoden anzeige-Methoden aufzurufen, das wars im Grunde schon,

aber wichtig: immer das aktuelle Graphics-Objekt als Parameter übergeben, nirgendwo längerfristig als Attribut speichern,
siehe auch Tutorial


----------



## ghost_hacker (6. Dez 2010)

ok, das problem mit anzeigen() bei der analoguhr hab ich jetzt auch behoben - da war n fehler in der if-schleife, sodass er das, was in else stand, nie ausgeführt hat. das programm funktioniert jetzt komplett, trotz der vielen getGraphics() .

falls es jemanden interessiert: hier ist der (vorerst) finale code


```
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class uhr7 extends Applet
implements ActionListener
{
	private int stunde, minute, sekunde, stunde_wecker, minute_wecker, sekunde_wecker;
	private TextField stunde_text, minute_text, sekunde_text, stunde_wecker_text, minute_wecker_text, sekunde_wecker_text;
	private Button uhr_anzeigen, uhr_starten, uhr_stoppen, wecker_starten, wecker_stoppen, wecker_schlafen;
	private analoguhr tictac;
	private Digitaluhr Digitalanzeige;
	private Graphics2D j, h;
	private AudioClip clockticking, weckersorgen;
	private wecker alarm;
	private boolean weckerklingelt;
	
	public void init()
	{
		clockticking = getAudioClip(getDocumentBase(), "clockticking.wav");
		weckersorgen = getAudioClip(getDocumentBase(), "wecker.wav");
		
		alarm = new wecker(weckersorgen);
		
		j = (Graphics2D) getGraphics();
		h = (Graphics2D) getGraphics();
		
		stunde_text = new TextField(2);
		add(stunde_text);
		stunde_text.setText("Stunde");
		stunde_text.selectAll();
		
		minute_text = new TextField(2);
		add(minute_text);
		minute_text.setText("Minute");
		minute_text.selectAll();
		
		sekunde_text = new TextField(2);
		add(sekunde_text);
		sekunde_text.setText("Sekunde");
		sekunde_text.selectAll();
		
		stunde_wecker_text = new TextField(2);
		add(stunde_wecker_text);
		stunde_wecker_text.setText("Stunde");
		stunde_wecker_text.selectAll();
		
		minute_wecker_text = new TextField(2);
		add(minute_wecker_text);
		minute_wecker_text.setText("Minute");
		minute_wecker_text.selectAll();
		
		sekunde_wecker_text = new TextField(2);
		add(sekunde_wecker_text);
		sekunde_wecker_text.setText("Sekunde");
		sekunde_wecker_text.selectAll();
		
		uhr_anzeigen = new Button("Anzeigen");
		add(uhr_anzeigen);
		uhr_anzeigen.addActionListener(this);
		
		uhr_starten = new Button("Start");
		add(uhr_starten);
		uhr_starten.addActionListener(this);
		
		uhr_stoppen = new Button("Stop");
		add(uhr_stoppen);
		uhr_stoppen.addActionListener(this);
		
		wecker_starten = new Button("Start");
		add(wecker_starten);
		wecker_starten.addActionListener(this);
		
		wecker_stoppen = new Button("Stop");
		add(wecker_stoppen);
		wecker_stoppen.addActionListener(this);
		
		wecker_schlafen = new Button("Schlafen");
		add(wecker_schlafen);
		wecker_schlafen.addActionListener(this);
		
		setLayout(null);
		stunde_text.setBounds(20,20,60,20);
		minute_text.setBounds(20,50,60,20);
		sekunde_text.setBounds(20,80,60,20);
		uhr_anzeigen.setBounds(90,20,60,20);
		uhr_starten.setBounds(90,50,60,20);
		uhr_stoppen.setBounds(90,80,60,20);
		stunde_wecker_text.setBounds(420,20,60,20);
		minute_wecker_text.setBounds(420,50,60,20);
		sekunde_wecker_text.setBounds(420,80,60,20);
		wecker_starten.setBounds(350,20,60,20);
		wecker_stoppen.setBounds(350,50,60,20);
		wecker_schlafen.setBounds(350,80,60,20);
	}
	
	public void actionPerformed(ActionEvent event)
	{
		if(event.getSource() == uhr_anzeigen)
		{
			tictac = new analoguhr();
			Digitalanzeige = new Digitaluhr();

			stunde = Integer.parseInt (stunde_text.getText());
			minute = Integer.parseInt (minute_text.getText());
			sekunde = Integer.parseInt (sekunde_text.getText());
					
			tictac.datenübergabe(stunde, minute, sekunde, clockticking, j);
			tictac.anzeigen();
			
			Digitalanzeige.datenübergabe(stunde,minute,sekunde,h);
			Digitalanzeige.anzeigen();
		}
		
		if(event.getSource() == uhr_starten)
		{
			tictac.start();			
			Digitalanzeige.start();
		}
		
		if(event.getSource() == uhr_stoppen)
		{
			tictac.anhalten();
			Digitalanzeige.anhalten();
		}
		
		if(event.getSource() == wecker_starten)
		{
			stunde_wecker = Integer.parseInt (stunde_wecker_text.getText());
			minute_wecker = Integer.parseInt (minute_wecker_text.getText());
			sekunde_wecker = Integer.parseInt (sekunde_wecker_text.getText());
			
			weckerklingelt = false;
			
			while(!weckerklingelt)
			{
				if(stunde_wecker == stunde && minute_wecker == minute && sekunde_wecker == sekunde)
				{
					weckerklingelt = true;
					alarm.klingeln();
				}
				
				else
				{
					stunde = tictac.rückgabe_stunde(stunde);
					minute = tictac.rückgabe_minute(minute);
					sekunde = tictac.rückgabe_sekunde(sekunde);
				}
			}
		}
		
		if(event.getSource() == wecker_stoppen)
		{
			alarm.klingeln_stop();
		}
		
		if(event.getSource() == wecker_schlafen)
		{
			alarm.schlafen();
		}
	}
	
	public void paint(Graphics g)
	{
		Graphics2D i = (Graphics2D) g;
		i.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		i.drawLine(250,20,250,100);
		Font beschreibung = new Font("Arial", Font.PLAIN, 20);
		i.setFont(beschreibung);
		
		i.drawString("Uhr", 210,70);
		i.drawString("Wecker", 260,70);
	}
}	

class analoguhr extends Thread
{
	private Graphics2D g;
	private int zentrum, radius;
	private int stunde, minute, sekunde;
	private boolean running;
	private AudioClip clockticking;
	
	public analoguhr()
	{
		zentrum = 250;
		radius = 100;
	}
	
	public void datenübergabe(int stunde_temp, int minute_temp, int sekunde_temp, AudioClip clockticking_temp, Graphics2D g_temp)
	{
		stunde = stunde_temp;
		minute = minute_temp;
		sekunde = sekunde_temp;
		clockticking = clockticking_temp;
		g = g_temp;
	}
	
	public void anzeigen()
	{
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		g.setColor(Color.white);
		g.fillRect(0,170,500,40);
		g.fillRect(zentrum-radius, zentrum-radius, 2*radius, 2*radius);
		if(stunde < 24 && stunde >= 0 && minute < 60 && minute >= 0 && sekunde < 60 && sekunde >= 0)
		{
			g.setColor(Color.black);
			g.drawOval(zentrum-2, zentrum-2,4,4);
		
			//Viertelstriche
			for (int i = 0; i < 4; i++)
			{
				g.drawLine(zentrum + (int) ((radius-7)*Math.cos(Math.toRadians(90*i))), zentrum + (int) ((radius-7)*Math.sin(Math.toRadians(90*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(90*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(90*i))));
			}
		
			//Stundenstriche
			for (int i = 0; i < 12; i++)
			{
				g.drawLine(zentrum + (int) ((radius-5)*Math.cos(Math.toRadians(30*i))), zentrum + (int) ((radius-5)*Math.sin(Math.toRadians(30*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(30*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(30*i))));
			}
		
			//Minutenstriche
			for(int i = 0; i < 60; i++)
			{
				g.drawLine(zentrum + (int) ((radius-2)*Math.cos(Math.toRadians(6*i))), zentrum + (int) ((radius-2)*Math.sin(Math.toRadians(6*i))), zentrum + (int) (radius*Math.cos(Math.toRadians(6*i))), zentrum + (int) (radius*Math.sin(Math.toRadians(6*i))));
			}
		
			//Stundenzeiger
			g.drawLine(zentrum, zentrum, zentrum + (int) (60*Math.cos(Math.toRadians(stunde%12*30+minute/2.0-90))), zentrum + (int) (60*Math.sin(Math.toRadians(stunde%12*30+minute/2.0-90))));
		
			//Minutenzeiger
			g.drawLine(zentrum, zentrum, zentrum + (int) (85*Math.cos(Math.toRadians(minute*6-90))), zentrum + (int) (85*Math.sin(Math.toRadians(minute*6-90))));
		
			//Sekundenzeiger
			g.setColor(Color.gray);
			g.drawLine(zentrum, zentrum, zentrum + (int) (90*Math.cos(Math.toRadians(sekunde*6-90))), zentrum + (int) (90*Math.sin(Math.toRadians(sekunde*6-90))));
		}
		
		else
		{
			Font fehlermeldung = new Font("Arial", Font.PLAIN, 40);
			g.setFont(fehlermeldung);
			g.setColor(Color.red);
			
			g.drawString("Error 99: User IQ underflow!", 5, 200);
		}
	}
	
	public void fehlermeldung()
	{		

	}
	
	public void run()
	{
		running = true;
		while(running)
		{
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException ie )
			{
				System.err.print("Fehler!");
			}
			
			if(stunde<24) if(stunde>=0) if(minute<60) if(minute>=0) if(sekunde<60) if(sekunde>=0)
			{
				clockticking.play();
			}
		
			if(sekunde<60)
			{
				sekunde++;
				if(sekunde==60)
				{
					sekunde=0;
					minute++;
					if(minute==60)
					{
						minute=0;
						stunde++;
						if(stunde==24)
						{
							stunde=0;
						}
					}
				}
			}
			
			anzeigen();
		}
	}
	
	public void anhalten()
	{
		running = false;
	}
	
	public int rückgabe_stunde(int stunde_temp)
	{
		stunde_temp = stunde;
		return stunde_temp;
	}
	
	public int rückgabe_minute(int minute_temp)
	{
		minute_temp = minute;
		return minute_temp;
	}
	
	public int rückgabe_sekunde(int sekunde_temp)
	{
		sekunde_temp = sekunde;
		return sekunde_temp;
	}
}

class Digitaluhr extends Thread

{
	private Graphics2D g;
	private int stunde,minute,sekunde;
	private boolean running;
	private String h, m, sec;

	Font digital = new Font("Arial", Font.ITALIC|Font.PLAIN, 60);

	public Digitaluhr ()
	{
	}
	
	public void datenübergabe(int stunde_a,int minute_a,int sekunde_a,Graphics2D temp)
	{
		stunde=stunde_a;
		minute=minute_a;
		sekunde=sekunde_a;
		g=temp;
	}
	
	public void anzeigen ()
	{
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		g.setFont(digital);
		g.setColor(Color.white);
		g.fillRect(0,360,500,140);
		g.setColor(Color.black);
		
		if(stunde<24) if(stunde>=0) if(minute<60) if(minute>=0) if(sekunde<60) if(sekunde>=0)
		{
  			if(stunde<10) 
  			{
   			h="0"+String.valueOf(stunde);
  			}
  			else 
  			{
   			h=String.valueOf(stunde);  
  			}
  			if(minute<10)
  			{
  				m="0"+String.valueOf(minute);
  			}
  			else
  			{
   			m=String.valueOf(minute); 
  			}
  			if(sekunde<10)
  			{
   			sec="0"+String.valueOf(sekunde);
  			}
  			else
  			{
   			sec=String.valueOf(sekunde);
  			}
			g.drawString(""+h,135,450);
			g.drawString(":"+m,200,450);
			g.drawString(":"+sec,280,450);
		}
	}
	
	public void run()
	{
		running=true;
		while(running)
		{
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException ie )
			{
				System.err.print("Fehler!");
			}
		
			if(sekunde<60)
			{
				sekunde++;
				if(sekunde==60)
				{
					sekunde=0;
					minute++;
					if(minute==60)
					{
						minute=0;
						stunde++;
						if(stunde==24)
						{
							stunde=0;
						}
					}
				}
			}
			
			anzeigen();		
		}
	}
	
	public void anhalten()
	{
		running=false;
	}
}

class wecker
{
	private AudioClip weckersorgen;
	private boolean ringing;
	
	public wecker(AudioClip weckersorgen_temp)
	{
		weckersorgen = weckersorgen_temp;
	}
	
	public void klingeln()
	{
		weckersorgen.loop();
	}
	
	public void klingeln_stop()
	{
		weckersorgen.stop();
	}
	
	public void schlafen()
	{
		weckersorgen.stop();
		 
		long t0, t1;

      t0 =  System.currentTimeMillis();

      do{
          t1 = System.currentTimeMillis();
      }
      while ((t1 - t0) < (10 * 1000));
      
      weckersorgen.loop();		
	}
}
```


----------



## mchook (17. Mai 2011)

Hallo,
ich sollte in den vorliegenden quelltext ein antialiasing einfügen damit die schrift geglättet wird.
ich wollte mal wissen obs so richtig ist ? 
[Java]
import java.awt.*;
import java.awt.Graphics2D;
import java.awt.image.*;
import javax.swing.*;


public class Lektion7 extends JApplet implements Runnable  {
    int faRot = 3, faGruen = 0, faBlau = 0;
    private Color textColor;
    private BufferedImage bufImage;
    boolean dir = true;

      // Abarbeitung eines Programmteils (Thread)
      public void run() {
      // Endlosschleife
        while(true) {
          animate();
          try {
            Thread.sleep(25);
          } catch(InterruptedException e) {
            e.printStackTrace(System.out);
          }
        }
      // Stop
      }

      public void animate() {
        // schrittweise Veraenderung der Farben
        if(faGruen == 0)
          dir = true;
        if(faBlau == 255)
        dir = false;
        if(dir) {
          if (faRot < 255)
            faRot += 3;
          else {
            if (faGruen < 255)
              faGruen += 3;
            else {
              if (faBlau < 255)
                faBlau += 3;
            }
          }
        } else {
          if (faRot > 0)
            faRot -= 3;
          else {
            if (faBlau > 0)
              faBlau -= 3;
            else {
              if (faGruen > 0)
                faGruen -= 3;
            }
          }
        }
        textColor = new Color(faRot, faGruen, faBlau);
        repaint();
      }

      public void paint(Graphics text) {
        if(createBuffer()) {
          Graphics2D g2 = (Graphics2D) bufImage.getGraphics();
          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
          // maximale Abmessungen des Grafikobjekts
          int px = getWidth();
          int py = getHeight();
          // Hintergrundfarbe
          Color bgColor = new Color(255-faRot, 255-faGruen, 255-faBlau);
          g2.setColor(bgColor);
          g2.fillRect(0, 0, px, py);
          g2.setColor(textColor);
          float pt = (faRot + faGruen + faBlau) / 765f * px;
          String family = "San-Serif";
          int style = Font.BOLD;
          // Textvergroesserung
          int size = (int) (py * pt  /  px) + 24;
          Font benutzerFont = new Font(family, style, size);
          g2.setFont(benutzerFont);

          // neue Textposition
          g2.drawString("Java", (int) pt -  size, (py + 3 * size / 4) / 2);
          // virtuelles Offset-Bild
          text.drawImage(bufImage, 0, 0, this);
          g2.dispose();
        }
      }		

	private boolean createBuffer() {
       if(bufImage != null)
         return true;
       else {
         if(getWidth() == 0 || getHeight() == 0)
            return false;
         // gepuffertes Bild ohne Transparenz
         bufImage = new BufferedImage(getWidth(), getHeight(),
                                       Transparency.OPAQUE);
       }
        return true;
      }

      public Dimension getPreferredSize() {
        return new Dimension(400, 80);
      }

      public void init() {
        JFrame fenster = new JFrame("Swing-Applet im eigenen Rahmen");
        // Aufloesen des Fensters nach dem Schliessen
        fenster.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // Inhaltsbereich (ContentPane) des Swing-Fensters
        Container appletRahmen = fenster.getContentPane();
        BorderLayout h1 = new BorderLayout();
        appletRahmen.setLayout(h1);
        JLabel titel = new JLabel( "pfennigdesign     ",
                                  JLabel.RIGHT);
        appletRahmen.add(titel, BorderLayout.SOUTH);
        // Hinzufuegen des Animationsobjekts zum Rahmen (Center)
       Lektion7 animator = new Lektion7();
        appletRahmen.add(animator, BorderLayout.CENTER);
        // Positionierung auf dem Bildschirm
        fenster.setLocation(400, 20);
        fenster.pack();
        fenster.setVisible(true);
        Thread thread = new Thread(animator);
        // Starten des Programmfragments, Uebergabe an die Methode run
        thread.start();
      }

}[/code]


----------



## SlaterB (18. Mai 2011)

ist richtig soweit direkt sichtbar, aber kannst du das nicht an der Programmausgabe direkt nachprüfen?


----------

