# Größe eines Fensters ermitteln



## hawkeye78 (4. Apr 2005)

Hallo,

ich bin mir nicht so ganz sicher ob ich besser hier oder besser im Anfängerbereich mit meiner Frage aufgehoben bin. Aber da es sich ja eigentlich um eine Frage für GUI-Programmierung handelt poste ich mal hier hin und hoffe das der Admin dann die Frage entsprechend umstellt .
Um nun mal auf meine Frage zu sprechen zu kommen, ich würde gerne eine kleine Uhr schreiben wo die Größe des Zifferblattes und die Zeiger von der Grösse des Fensters abhängt. Aus diesem Grund würde ich gerne zunächst die Größe des Fensters ermitteln bevor ich dort das Zifferblatt hinein zeichne. Ich habe irgendwo gelesen das es logischerweise von der Auflösung des Bildschirmes abhängt. Aber leider habe ich dort keinen entsprechenden Befehl für die Fenstergrösse gefunden.
Ich wäre über einen entsprechenden Tipp auf jeden Fall sehr dankbar.
Gruß
Dan


----------



## Beni (4. Apr 2005)

Jede Component (egal ob Window, Frame oder Button) hat eine Methode 'getSize()'.

Das kannst du in der API nachlesen.

Am besten malst du nicht direkt auf ein Frame, sondern auf ein Panel (oder JPanel, wenn du Swing verwendest), dann stimmen der sichtbare Bereich und getSize auch ueberein (ansonsten wird der sichtbare Bereich durch den Titel des Frames verkleinert).


----------



## Bert Brenner (4. Apr 2005)

Wenn dein Fenster von java.awt.Component abstammt dann mit:

getSize();

Edit: Die Methode von Beni würd ich aber auch vorziehen, damit du gleich die Grösse der Fläche bekommst die du vollzeichnen möchtest.


----------



## mic_checker (4. Apr 2005)

Meinst du Auflösung oder Größe ? Einfach nur Größe sollte eigentlich mit getSize() gehen.

edit: zu langsam


----------



## hawkeye78 (4. Apr 2005)

Hallo

vielen Dank für diese zahlreichen Posting, und eure schnelle Hilfe, vielleicht sollte ich in Zukunft doch etwas sorgfälltiger die API lesen .
Allerdings stehe ich nun vor einem anderen Problem nämlich das ich es nicht hinbekomme einen runden(!) Kreis in das Fenster zu zeichnen. Mein Programmcode schaut momentan so aus:

Klasse für den Aufruf des Programms:

```
public class aufruf
{
	public static void main(String args[])
	{
		Uhr U1;
		
		U1=new Uhr();
		
		U1.setSize(200,200);
		U1.show();		
	}
}
```

Methode zum Zeichnen des Kreises

```
public class Uhr
extends Frame
implements WindowListener
{
	Uhr()
	{
		// Festlegen der Bezeichnung fürs Fensters
		super("Uhr");
		
		addWindowListener(this);              // Hinzufügen der WindowListener	
	}
	
	public void paint(Graphics g)
	{
		g.drawOval(10,35,this.getSize().width-18,this.getSize().height-45);
		
		System.out.println(this.getSize().width);
		System.out.println(this.getSize().height);
	}

// Methoden für die listener..
}
```

Leider wird der Kreis alles mögliche bloß nicht rund und ich bin im moment ziemlich ratlos wie ich es mit den entsprechenden Parametern hinbekomme.
Gruß
Dan


----------



## mic_checker (4. Apr 2005)

Du hast unterschiedliche Parameter für Höhe/Breite, dann ist ja klar das du keinen richtigen Kreis zeichnest.


----------



## hawkeye78 (4. Apr 2005)

Hallo,

noch einmal vielen dank für dein Posting. Aber leider funktioniert das so


```
public void paint(Graphics g) 
   { 
      g.drawOval(10,35,this.getSize().width-10,this.getSize().height-35); 
       
      System.out.println(this.getSize().width); 
      System.out.println(this.getSize().height); 
   }
```

auch nicht.
Gruß
Dan


----------



## mic_checker (4. Apr 2005)

```
g.drawOval(10,35,this.getSize().width-10,this.getSize().height-35);
```
Du gibst die Höhe/Breite an, wenn Höhe Fenster == Breite Fenster, ist somit die Höhe/Breite des Kreises nicht gleich und es wird kein runder Kreis gezeichnet. Das meinte ich mit den Parametern.


----------



## hawkeye78 (4. Apr 2005)

ich verstehe jetzt was du meinst vielen dank. Aber in welcher Form kann ich es jetzt angeben das er mir doch einen kreis zeichnet? Ich sehe im moment keine wirklich lösung meinst du vielleicht so?

```
g.drawOval(0,0,this.getSize().width,this.getSize().height);
```


----------



## mic_checker (4. Apr 2005)

Theoretisch ja, in deinem Fall sind Höhe/Breite ja gleich.....Ansonsten musst du halt das ganze entsprechend vorher festlegen,also falls Höhe != Breite.


----------



## Illuvatar (4. Apr 2005)

Du könntest den kleineren der Werte nehmen:

```
int val = ((this.getSize().width) < (this.getSize().height-25)) ? (this.getSize().width-10) : (this.getSize().height-35);
g.drawOval (10, 35, val, val);
```


----------



## hawkeye78 (5. Apr 2005)

Hallo Illuvatar,

noch einmal vielen Dank für eure Postings, ich habe es mittlerweile wirklich so gelöst das ich den kleinsten möglichen Wert genommen habe


```
int y=this.getInsets().top;
		int x=this.getInsets().left;
		int breite=(this.getSize().width-(this.getInsets().left+this.getInsets().right));
		int hoehe=(this.getSize().height-(this.getInsets().top+this.getInsets().bottom));
		
		// Ermittlung der maximalen Fläche für das Zifferblatt
		if(breite!=hoehe)
		{
			if(breite<hoehe)
			{
				hoehe=hoehe-(hoehe-breite);
			}
			
			if(breite>hoehe)
			{
				breite=breite-(breite-hoehe);
			}
		}
		
		// Zeichnen des Kreises
		g.drawOval(x,y,hoehe,breite);
```

Ich bin zwar fest davon überzeugt das es einen eleganteren Weg gibt dieses zu lösen aber auf jeden Fall funktioniert es so .
Noch einmal vielen dank für euere Hilfe.
Gruß
Dan


----------



## Bert Brenner (5. Apr 2005)

Du brauchst keine Variable für hoehe und breite.

Nimm eine und nenn sie z.b. 


```
int groesse = Math.min(this.getSize().width-(this.getInsets().left+this.getInsets().right),
                       this.getSize().height-(this.getInsets().top+this.getInsets().bottom));
```


----------



## Illuvatar (5. Apr 2005)

Der Code is fast so spaghettig wie meiner.


----------

