# Grösse von BorderLayout.CENTER ermitteln



## max60watt (29. Jan 2009)

Hallo,

ich möchte die Grösse von BorderLayout.CENTER ermitteln um darin ein JPanel mit Null-Layout und setPreferredSize zu platzieren.
Nachstehend ein KSKB, welches nach verschieben der JToolBar eigentlich die Grösse von BorderLayout.CENTER ermitteln soll (Kommentar).

Kann mir jemand weiterhelfen ?


```
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;

public class Main extends JFrame implements AncestorListener{
JToolBar toolbar = new JToolBar();
BorderLayout borderLayout = new BorderLayout();
//------------------------------------------------------------------------------------------------
  public Main(){
    super("Main");
    setLayout(borderLayout);
    toolbar.add(new JButton("Button"));
    add(toolbar, BorderLayout.NORTH);

    toolbar.addAncestorListener(this);
  }
//------------------------------------------------------------------------------------------------
  public void ancestorAdded(AncestorEvent event){
    getCenterSize();
  }
//------------------------------------------------------------------------------------------------
  public void ancestorMoved(AncestorEvent event){}
//------------------------------------------------------------------------------------------------
  public void ancestorRemoved(AncestorEvent event){}
//------------------------------------------------------------------------------------------------
  public void getCenterSize(){
    // hier die Grösse von BorderLayout.CENTER ermitteln
  }
//------------------------------------------------------------------------------------------------
  public static void main(String args[]){
  Main t = new Main();
    t.setSize(800,600);
    t.setLocationRelativeTo(null);
    t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    t.setVisible(true);
  }
//------------------------------------------------------------------------------------------------
}
```


Grüss Max


----------



## André Uhres (30. Jan 2009)

```
/*
 * Main.java
 * 
 * ermittelt die Grösse von BorderLayout.CENTER
 * anhand der dor abgelegten Komponente.
 * Die Komponente (hier ein JPanel) erhält einen ComponentListener.
 * Bei componentResized hat sie vollautomatisch die exakte Grösse
 * vom BorderLayout.CENTER.
 */
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 public class Main extends JFrame {
 private JToolBar toolbar;
 private JPanel centerPanel;
 public Main() {
 super("Main");
 toolbar = new JToolBar();
 centerPanel = new JPanel(null);
 toolbar.add(new JButton("Button"));
 add(toolbar, BorderLayout.NORTH);
 add(centerPanel, BorderLayout.CENTER);
 centerPanel.addComponentListener(new ComponentAdapter() {
 @Override
 public void componentResized(final ComponentEvent e) {
 System.out.println(getCenterSize());
 }
 });
 }
 public Dimension getCenterSize() {
 // hier die Grösse von BorderLayout.CENTER ermitteln
 return centerPanel.getSize();
 }
 public static void main(final String[] args) {
 Runnable gui = new Runnable() {
 @Override
 public void run() {
 try {
 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 } catch (Exception ex) {
 ex.printStackTrace();
 }
 Main t = new Main();
 t.setSize(800, 600);
 t.setLocationRelativeTo(null);
 t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 t.setVisible(true);
 }
 };
 //GUI must start on EventDispatchThread:
 SwingUtilities.invokeLater(gui);
 }
 }
```


----------



## max60watt (31. Jan 2009)

Hat funktioniert. Besten Dank André

Grüss Max


----------



## Nachtschatten (16. Nov 2011)

Habe das selbe Problem. Ich möchte im Center eine Grafik ausgeben die immer in der Mitte des Centers sein soll ? Um die Position zu berechnen wollte ich die Größe des Centers ermitteln. So das die Grafik je nach Vergrößern oder Verkleinern des Fensters in der Mitte bleibt. 

Hat jemand einen Tipp für mich ?


----------



## L-ectron-X (16. Nov 2011)

Wenn das Element, welches in der Mitte sitzen soll, seine fest eingestellte oder bevorzugte Größe behalten soll. benutzt dafür am besten das GridBagLayout.
Wenn du nur eine Komponente in der Mitte halten willst, geht das wohl am schnellsten und einfachsten.

Beispiele: 
http://www.java-forum.org/awt-swing-swt/126550-kurze-layout-frage-komponente-mittig.html
http://www.java-forum.org/awt-swing-swt/119753-groesse-buttons-aendern.html


----------



## Nachtschatten (16. Nov 2011)

Bin völliger Neuling. Mache die Umschulung erst seit 6 Wochen und hatte davor nie etwas damit zu tun. 

Mit dem Grid Layout meinst du ein 1,1 ins Center Packen ?
Die Aufgabenstellung ist das sich der Kreis in der Mitte per Buttons vergrößern oder verkleinern lässt. Und er soll immer in der Mitte bleiben.


----------



## L-ectron-X (16. Nov 2011)

Die Lösung zu dem, was ihr machen sollt, hängt von der Aufgabenstellung ab.
Was für ein Kreis? Grafik/Bild oder selbst gezeichnet?


----------



## Nachtschatten (16. Nov 2011)

2.3 Aufgabe (A)
Erstellen Sie eine Applikation mit weißem Hintergrund, einer Schaltfläche "zoom +" und einem JLabel-Feld. Der Button soll die Hintergrundfarbe cyan besitzen. In der Mitte des 400x400 Pixel großen Frames soll ein Kreis mit Anfangsdurchmesser 10 gezeichnet werden. Bei jedem Klick auf den Button soll sich der Durchmesser um 10 Pixel erhöhen.

1.6 Aufgabe (B)
Ergänzen Sie das Programm zu Aufgabe 2.3 aus Kapitel 3 um einen zweiten Button "zoom -", so dass der Kreis jetzt sowohl vergrößert als auch verkleinert werden kann. Die Änderung beträgt jeweils 10 Pixel.
Die minimale Größe ist 10 und die maximale Größe ist 200. Wählen Sie die Fenstergröße 400x400. Der Kreis erscheint immer zentriert.

Inzwischen weiß ich selbst positionieren wäre besser gewesen. Aber denke müsste ja auch mit dem Layout gehen.


----------



## L-ectron-X (16. Nov 2011)

Nachtschatten hat gesagt.:


> Inzwischen weiß ich selbst positionieren wäre besser gewesen.


In diesem Fall, ja.



Nachtschatten hat gesagt.:


> Aber denke müsste ja auch mit dem Layout gehen.


Sicher. Dazu musst du an der Komponente, auf der du malst, nach jedem Zoomen die bevorzugte Größe setzen (_setPreferredSize(...)_) und danach validate() aufrufen, damit der LayoutManager die Komponente entsprechend ihrer neuen Größe positioniert.


----------

