JFrame und JPanel - Unschönheiten

Status
Nicht offen für weitere Antworten.

raven

Bekanntes Mitglied
Hallo...
Ich habe mal wieder seit einer Weile zwei Frage, was JFrame und JPanel betrifft.

1) Ich habe bei den erstellen eines JFrames und das überschreiben der paintComponent() bemerkt, wenn ich an der Koordinate 0,0 anfange irgendetwas zu zeichnen, das die x-Koordinate alles schön und gut funktioniert, aber leider das gezeichnete durch in der y-Richtung von dar Titelleiste ein wenig verschluckt wird. Meine Frage wie kann ich die Höhe, die auf jeden System bzw. bei jeden Look n' Feel anders sein kann, der Titelleiste ermitteln. Also gibt es da eine Methode um dann genau, mein gezeichnetes um die Höhe der Titelleiste nach unten zu versetzten. Damit mein gezeichnetes nicht von der Titelleiste überdeckt wird.

2) Die zweite Frage betrifft das JPanel. Wenn ich ein JPanel auf ein JFrame adde. Und ich die Höhe und Breite mit getHeight() und getWidth() ermitteln will, dann ist diese zu dem Zeitpunkt(um Konstruktor) noch null. Ich erhalte erst die richtigen Werte, wenn ich diese Ermittlung in die paint-Methode verlagere. Wie kann ich dies umgehen, das ich bereits kurz nach dem adden des Panels die Werte ermitteln kann?


Dies sind für manche zwar Kleinigkeiten, jdoch empfinde ich dieses als störend...

Hoffe einige von euch können mir Helfen, wenn es davür überhaupt eine Lösung gibt.

mfg raven
 
JFrame hat keine paintComponent-Methode. Im Allgemeinen empfihelt es sich, einem JFrame nicht zu sehr ins Handwerk zu pfuschen, und als oberste Component, in der man SELBST paintet (d.h. in der main PaintComponent überschreibt) eine JPanel zu verwenden, das man ins ContentPane des JFrames legt (oder manchmal auch als das ContentPane des JFrames einsetzt).

Die Sache mit der Größe: Man erhält zu jedem beliebiegen Zeitpunkt die aktuelle Größe eines JPanels mit panel.getWidth() und panel.getHeight() (bzw. getSize() und so). Warum willst du die nochmal zwischenspeichern? Das KÖNNTE man machen - man müßte die zwischengespeicherten Werte aber bei jeder Änderung aktualisieren (mit einem ComponentListener), aber ich kann mir spontan nicht vorstellen, warum man das tun sollte...
 
1) Ich habe bei den erstellen eines JFrames und das überschreiben der paintComponent() bemerkt, wenn ich an der Koordinate 0,0 anfange irgendetwas zu zeichnen, das die x-Koordinate alles schön und gut funktioniert, aber leider das gezeichnete durch in der y-Richtung von dar Titelleiste ein wenig verschluckt wird. Meine Frage wie kann ich die Höhe, die auf jeden System bzw. bei jeden Look n' Feel anders sein kann, der Titelleiste ermitteln. Also gibt es da eine Methode um dann genau, mein gezeichnetes um die Höhe der Titelleiste nach unten zu versetzten. Damit mein gezeichnetes nicht von der Titelleiste überdeckt wird.
Am besten gar nicht die paintComponents()-Methode des JFrames überschreiben, sondern ein JPanel machen, dessen paintComponent()-Methode überschreiben und dann als ContentPane auf das JFrame. Damit umgehst Du dieses Problem.

2) Die zweite Frage betrifft das JPanel. Wenn ich ein JPanel auf ein JFrame adde. Und ich die Höhe und Breite mit getHeight() und getWidth() ermitteln will, dann ist diese zu dem Zeitpunkt(um Konstruktor) noch null. Ich erhalte erst die richtigen Werte, wenn ich diese Ermittlung in die paint-Methode verlagere. Wie kann ich dies umgehen, das ich bereits kurz nach dem adden des Panels die Werte ermitteln kann?
Die Größe einer Komponente bestimmt sich, wenn die gesamte Komponenthierarchie vom Fenster bis zu jedem angezeigten Kind validiert wird. So richtig umgehen kann man das beim Erzeugen einer Komponente gar nicht, da deren Parent dafür zuständig ist die Größe zu setzen. Und der kann ja zum Zeitpunkt der Erzeugung des Kindes -- also im Konstruktor während dieses noch gar nicht fertig erzeugt ist -- nicht wissen, wie groß er das Kind gern hätte. Die tatsächliche Größe beim Zeichnen abzufragen ist eigentlich der richtige Weg. Wozu benötigst Du die Größe denn vorher?

Ebenius
 
Wozu benötigst Du die Größe denn vorher?

Ebenius
Mich hat das einfach vorher gestört, das in der painComponet zu erledigen, aber wenn es nicht anders geht, dann werde ich es auch weiterhin so machen...



JFrame hat keine paintComponent-Methode. Im Allgemeinen empfihelt es sich, einem JFrame nicht zu sehr ins Handwerk zu pfuschen, und als oberste Component, in der man SELBST paintet (d.h. in der main PaintComponent überschreibt) eine JPanel zu verwenden, das man ins ContentPane des JFrames legt (oder manchmal auch als das ContentPane des JFrames einsetzt).

Die Sache mit der Größe: Man erhält zu jedem beliebiegen Zeitpunkt die aktuelle Größe eines JPanels mit panel.getWidth() und panel.getHeight() (bzw. getSize() und so). Warum willst du die nochmal zwischenspeichern? Das KÖNNTE man machen - man müßte die zwischengespeicherten Werte aber bei jeder Änderung aktualisieren (mit einem ComponentListener), aber ich kann mir spontan nicht vorstellen, warum man das tun sollte...

naja eigentlich hatte ich ja auch JPanel also im Frame udn die paintComponent vom JPanel überschrieben, war nur biss unglücklich formuliert. Aber dadurch wird mein gezeichnetes doch immer noch von der Titelleiste überdeckt.
 
Dann ist natürlich alles anders. 🙂 Hast Du einen Border auf dem Panel? Dann musst Du mit getInsets() die Insets holen und left/top auf x/y aufrechnen und left+right/top+bottom von width/height abziehen.

Ansonsten: Kannste mal ein einfaches ausführbares Beispiel zusammenbasteln? Einfach eine schräge Linie in einem JPanel auf einem JFrame mit dem genau das passiert.

Ebenius
 
Mit getInsets auf dem JFrame bekommt man AFAIK genau die Größe von Titelleiste und Rand und so... aber das sollte nicht notwendig sein, wenn das JPanel im ContentPanel liegt...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben