# Rectangle on JPanel zentrieren



## plammy (6. Jun 2012)

Hallo  Ich versuche vergeblich ein Rectangle auf mein JPanel zu zentrieren .. ich habe so versucht 


```
public void paintComponent(Graphics g) {
        
        Rectangle headerRect = new Rectangle(editPanel.getWidth()/2,editPanel.getHeight()/2,500,500);    
        g.setColor(new Color(230,227,224)); //gray
        g.fill3DRect(headerRect.x, headerRect.y, headerRect.width, headerRect.height,true);
        g.setColor(new Color(211,111,53)); //orange
```


aber das funktioniert nur mit Rectangle2D... Jemand ne Idee??


----------



## XHelp (6. Jun 2012)

Was heißt "das funktioniert nur mit Rectangle2D?
Aber du zentrierst das ganze nicht, sondern fängst bei der Mitte an, versuche es mal mit:

```
Rectangle headerRect = new Rectangle(editPanel.getWidth()/2-250,editPanel.getHeight()/2-250,500,500);
```


----------



## Marco13 (6. Jun 2012)

Was funktioniert mit Rectangle2D? ???:L

int w = 500;
int h = 500;
 Rectangle headerRect = new Rectangle(editPanel.getWidth()/2-w/2,editPanel.getHeight()/2-h/2,w,h);


EDIT: XHelp mal wieder... ich räume das Feld und überlasse das Antworten den jungen, ausgeschlafenen...


----------



## XHelp (6. Jun 2012)

Aber die [STRIKE]alten[/STRIKE] reifen und unausgeschlafenen bringen die schöneren Lösungen


----------



## plammy (6. Jun 2012)

Super danke es funktioniert , aaber .. ... wenn ich jetzt mehrere rectangles untereinander anhängen möchte verschiebt sich die ganze Struktur aus Rectangles nicht im Zentrum sondern einfach weiter und weiter runter... Sprich nur der erste Rectangle ist vertical zentriert .. Gibt es eine Funktion mit dem man das ganze immer zentriert und jedes einzelnen..Ich habs glaube ich schlecht erklärt... am besten siehe Photo..


```
public void paintComponent(Graphics g) {
        
        int centerX = editPanel.getWidth()/2;       
        int centerY = editPanel.getHeight()/2;

//header
        Rectangle headerRect = new Rectangle(centerX-500/2,centerY-100/2,500,100);    
        g.setColor(new Color(230,227,224));
        g.fill3DRect(headerRect.x, headerRect.y, headerRect.width, headerRect.height,true);
 
        
 
        //content
        Rectangle contentRect = new Rectangle(centerX-500/2,centerY+100/2,500,300);
        g.setColor(new Color(230,27,224));
        g.fill3DRect(contentRect.x, contentRect.y, contentRect.width, contentRect.height,true);
        
    
        //footer
        Rectangle footerRect = new Rectangle(centerX-500/2,centerY+100/2+300,500,90);
        g.setColor(new Color(20,227,224));
        g.fill3DRect(footerRect.x, footerRect.y, footerRect.width, footerRect.height,true);
```


----------



## Marco13 (6. Jun 2012)

Ich kapier das ja nicht ganz. Das ist Mathematik der 6. oder 7. Klasse :noe: Du musst ausrechnen, wie groß die Rechtecke insgesamt sind, und dieses "große" Rechteck dann zentrieren. Den Code können dir die jungen vorkauen


----------



## plammy (6. Jun 2012)

Sry versteh ich nicht wie du das meinst.. zuammenrechenen kriege ich schon hin aber wie soll ich den rectangles zusammenrechenen??

headerRect+contentRect+footerRect;

das geht doch so nicht


----------



## XHelp (6. Jun 2012)

Vlt solltest du mal versuchen die *HÖHE* der Rectangles zusammenzurechnene :bahnhof:
Darüber hinaus noch ein gedanke: je nach dem was du machen willst könnte es sinnvoller sein einfach nur 3 Pannels hinzuzufügen und einen geeigneten LayoutManager sich um das Layout kümmern zu lassen.


----------



## plammy (6. Jun 2012)

geht auch nicht mit der Höhe  .. außerdem müssen die schon als einzelne rectangles bleiben da später verschiedene sachen dynamisch noch darin gemalen werden sollen.. Und die größen sollen nicht so fest sein sondern immer von userinput ausgelesen werden ... Geht nicht iwie mit translate() easier


----------



## XHelp (6. Jun 2012)

"iwie" wird das nicht wirklich "easier": du willst es nach Höhe zentrieren also brauchst du die gesamte Höhe.
Nimm dir doch ein Blatt Papier und zeichne da genau so die 3 Rechtecke zentriert hin um das Vorgehen zu verstehen.


----------



## Marco13 (6. Jun 2012)

Beschreib' halt mal genauer, was du eigentlich vorhast. Wenn IN die Rectangles was reingemalt werden soll (was nicht irgendeine "Sprite" ist), könnte es ohnehin einfacher sein, dort keine Rectangles sondern JPanels zu verwenden, aber ... wer weiß das schon...


----------



## plammy (6. Jun 2012)

also...ich hab ein editPanel wo man durch nutzereingaben so was wie webseitenlayout erstellen kann... (header, content, footer-size der seite)..das sind quasi die 3 rechtecke die ich immer durch userinput auf dem editPanel erstellen werden sollen und da das der webseite-layout darstellen soll immer auch zentriert auf dem editPanel... demweiteren soll es auch 2 felder geben wo man auch breite und höte eingeben kann und dadurch ein neues rechteckt erscheint, den man aber mit der mouse iwo auf den pinken Recheck positionieren kann..(also dynamische Position), diese weiteren rechtecken muss man nicht zentrieren


----------



## plammy (6. Jun 2012)

wenn man nur so zahlen eingibt ist ja kein ding aber mit unterschiedlichen userinputs jedes mal zeichnet der auch jedes mal war anderes ... (( .... Ich kriegst iwie nicht hin ..mein Kopf platzt gleich..


```
headerW = Integer.parseInt(headerWidth.getText());
headerH = Integer.parseInt(headerHeight.getText());
contentW = Integer.parseInt(contentWidth.getText());
contentH = Integer.parseInt(contentHeight.getText());
footerW = Integer.parseInt(footerWidth.getText());
footerH = Integer.parseInt(footerHeight.getText()); 

 public void paintComponent(Graphics g) {
        
        int centerX = editPanel.getWidth()/2;     
        int centerY = editPanel.getHeight()/2;       

        //header
        Rectangle headerRect = new Rectangle(centerX-headerW/2,centerY-headerH/2-contentH/2-footerH/2,headerW,headerH);  
       
        g.fill3DRect(headerRect.x, headerRect.y, headerRect.width, headerRect.height,true);
        
       
        //content
        Rectangle contentRect = new Rectangle(centerX-contentW/2,centerY-contentH/2,contentW,contentH);
       
        g.fill3DRect(contentRect.x, contentRect.y, contentRect.width, contentRect.height,true);
        
        
        //footer
        Rectangle footerRect = new Rectangle(centerX-footerW/2,centerY-footerH/2,footerW,footerH);
 
        g.fill3DRect(footerRect.x, footerRect.y, footerRect.width, footerRect.height,true);
```


----------



## XHelp (6. Jun 2012)

Nach wie vor gilt: nimm ein Blatt Papier und rechne dir Werte per Hand durch, dann wird dir vlt schon auffallen, wo der Fehler ist.


----------



## Marco13 (6. Jun 2012)

Wenn der Bildschirm 300 Pixel hoch ist, und die Rechtecke
Header 50 Pixel
Center 100 Pixel
Footer 50 Pixel
hoch sind, sind es insgesamt 200 Pixel. Also sind oben und unten noch 50 Pixel übrig. Also fängt man bei y=50 an den Header zu malen, malt dann bei y+headerHöhe das Center, dann bei y+headerHöhe+centerHöhe den Footer.... Wenn du das Problem genauer beschreibst, kann man vielleicht auch genauer helfen, ansonsten hilft nur ein Link auf Grundrechenart ? Wikipedia :bahnhof:


----------



## plammy (7. Jun 2012)

cool super danke so ist das auf jeden fall klar geworden :applaus:
 man versucht immer viel komplizierter zu denken als es eigentlich ist


----------



## plammy (7. Jun 2012)

was ich jetzt versuche ist auch spannend  .. nachdem ich diese 3 Rectecke mal dank ein Button gezeichnet habe will ich mit einem anderen Button noch 3 dazuzeichnen (also wenn die erwünscht sind)..
ich habe mir gedachte das kann man mit der Methode translate() ganz gut machen.. z.B. bei erstellen einen neuen Rechteck der über alle andere sein sollneu die sratposition errechenen (editPanel - (neuen Rechteck + summe der anderen)  /2) das klappt auch.. die bestehenden sollen sich aber jetzt nach unten verschieben und zwar genau so viel wie die Höhe der neuen Rechteck sind sonst überlappen die sich ja ..ich hab folgendes versucht aber iwie sehe ichkeine Auswirkung und weiß nicht wieso nicht???


```
int beginPositionNeu = (editPanel.getHeight()-(headerH + contentH+ footerH+neuH))/2;


        //neu
        Rectangle neuRect = new Rectangle(centerX-headerW/2,beginPositionNeu,neuW,neuH);
        g.setColor(new Color(211,111,53));  
        g.fill3DRect( neuRect.x,  neuRect.y,  neuRect.width,  neuRect.height,true);
        headerRect.translate(0,neuH);
        contentRect.translate(0,neuH);
        footerRect.translate(0,neuH);
```


----------



## Marco13 (7. Jun 2012)

Wie alt bist du, wofür machst du das, und was ist das letztendliche Ziel?


----------



## plammy (7. Jun 2012)

zu "Wie alt bist du" : was spielt das denn für eine Rolle???
zu "Wofür machst du das": ich hab das als Projekt um JAVA zu lernen
zu "Was ist das Ziel letztendlich": Das Programm soll halt 3 feste Rechtecke zeichnen können. Noch 3 die sich an spezielle Stellen später wenn man die erstellt auch an bestimmten Stellen positionieren.Man sollte aber noch die Möglichkeit haben ein Rechteck zu erstellen und den mit der Mouse da zu plazieren, wo man will also keine fest vogegebene Position.


P.S: ich habs geschafft mit meinem Alter... funktioniert...


----------



## XHelp (7. Jun 2012)

Wenn du merkst, dass das Projekt zu schwer für dich ist, dann geh doch paar Schritte zurück. Zumal du ohnehin noch starke Probleme mit der Maus-Bewegung bekommen wirst.
Und die Frage nach dem Alter könnte vermutlich folgendes bedeuten: du weißt jetzt wie du 3 Rechtecke zentriert darstellen kannst: du errechnest die Summe der Höhen, ziehst es aus der Höhe des Panels ab und teils durch 2 - das ist dann deine Startposition.
Und jetzt hast du plötzlich 6 Rechtecke... hmm... du errechnest die Summe der Höhen, ziehst es aus der Höhe des Panels ab und teils durch 2 - das ist dann deine Startposition.


----------



## Marco13 (8. Jun 2012)

Die Fragen zielten alle darauf ab, besser abschätzen zu können, wie man die Fragen beantworten soll. Wenn der gepostete Code (mit dem translate) in der paintComponent steht, werden die Rechtecke bei jedem Zeichnen transliert, was sicher nicht das Ziel ist. Und ansonsten gehe ich davon aus, dass einen Schritt zurück zu gehen und sich eine Struktur zu überlegen, für das, WAS das Ziel ist, hilfreicher sein drüfte, als sich durch eine Mischung aus Fragen und Probieren an spezifischen Punkten irgendwas zusammenzufrickeln. Aber vielleicht ist das ja nicht so wichtig.


----------

