# Panel zentrieren



## Kanitrino (9. Sep 2010)

Hallo Experten,

Ich habe Folgendes vor : Der JFrame einer  Applikation soll den gesamten Bildschirm einnehmen, und die eigentliche Graphik bzw. Animation soll, unabhängig von der Bildschirmgröße, zentral vor einem neutralen Hintergrund (hier : gelb) darin erscheinen.

Diese "eigentliche Graphik" habe ich nun im u. a. Beispiel durch ein Panel (JPanel1) der Größe 200*200, mit Rand und rosa Hintergrund, dargestellt. Dann habe ich es per Borderlayout ins Zentrum eingebunden.

Das geht aber so nicht ! Mein Panel füllt nun den gesamten Bildschirm aus, die "setSize()"-Angabe wird ignoriert.

Kann mir jemand sagen, wie man so etwas realisieren kann ?


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

public class PanelTest extends JPanel
{
	Toolkit tool;
	Dimension size;
	Panel1 panel1;

	public PanelTest()
	{
		size = tool.getDefaultToolkit().getScreenSize();
		setPreferredSize(size);
		setBackground(Color.yellow);
		JFrame frame = new JFrame("Test");
		frame.setLocation(0, 0);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		setPanels();
		frame.setVisible(true);
	}

	public static void main(String arguments[])
	{
		new PanelTest();
	}

	public void setPanels()
	{
		setLayout(new BorderLayout());
		panel1 = new Panel1();
		add("Center", panel1);

	}
}

class Panel1 extends JPanel
{
	public Panel1()
	{
		this.setSize(200, 200);
		this.setBorder(BorderFactory.createEtchedBorder());
		setBackground(Color. pink);
	}
}
```
(N.B.: Eigentlich habe ich ja schon eine Lösung gehabt, nämlich ein Applet zu schreiben und es zentral in einen html-Rahmen einzubinden. Allerdings meckern die Leute hier im Forum immer über Applets, deshalb wollte ich es mal mit einer Applikation versuchen)


----------



## XHelp (9. Sep 2010)

Layoutmanager übernimmt die Größen.
Du könntest ggf versuchen setMaximumSize auf 200x200 zu setzen.


----------



## KrokoDiehl (9. Sep 2010)

Das BorderLayout macht die CENTRAL-Komponente so groß wie möglich. Du müsstest also an die Seiten Dummies legen, die eine gewisse Breite/Höhe haben. Geht einfach durch 
	
	
	
	





```
Box.createHorizontalStrut(50)
```
 und entsprechende.


----------



## jgh (9. Sep 2010)

das wäre eine weitere Möglichkeit...wenn du nur auf deinem Panel1 was machen willst?


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

public class PanelTest extends JPanel {

    public PanelTest() {

        // setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize());
        setBackground(Color.yellow);
        JFrame frame = new JFrame("Test");
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        setPanels();
        setLayout(new GridBagLayout());
        frame.setVisible(true);
    }

    public static void main(String arguments[]) {
        new PanelTest();
    }

    public void setPanels() {
        Panel1 panel1 = new Panel1();
        add(panel1);

    }
}

class Panel1 extends JPanel {
    public Panel1() {
        this.setPreferredSize(new Dimension(200, 200));
        this.setBorder(BorderFactory.createEtchedBorder());
        setBackground(Color.pink);
    }
}
```


----------



## Kanitrino (9. Sep 2010)

jgh hat gesagt.:


> das wäre eine weitere Möglichkeit...wenn du nur auf deinem Panel1 was machen willst?


Hurra, hurra, es klappt ! 
(Ich ringe noch darum, zu verstehen, warum, so ganz ohne Constraints)

In der Tat dient es nur dazu, Panel1 einzubinden, für mich wäre es also richtig.

Vielen Dank!




			
				xHelp hat gesagt.:
			
		

> Du könntest ggf versuchen setMaximumSize auf 200x200 zu setzen.


Das habe ich jetzt ausprobiert, es verändert aber nichts.



			
				KrokoDiehl hat gesagt.:
			
		

> Du müsstest also an die Seiten Dummies legen, die eine gewisse Breite/Höhe haben.


Daran hatt ich auch schon gedacht. Ich fand es aber unelegant, ein "schlaues" Kommando durch noch mehr Schauheit überlisten zu wollen, damit es weniger schlau wird...


----------



## jgh (9. Sep 2010)

Kanitrino hat gesagt.:


> Hurra, hurra, es klappt !
> (Ich ringe noch darum, zu verstehen, warum, so ganz ohne Constraints)



Die GridBagConstraints dienen "nur" dazu, mehrere Komponenten anzuordnen. Wenn du nur eine einzige Komponente (Panel1) hast, zentriert er es dir einfach und versucht die PreferedSize darzustellen.


----------



## Kanitrino (4. Okt 2010)

ja, es kam wie offenbar so oft : Nun habe ich ein neues Problem.

Mit dem nunmehr so elegant zentrierten JPanel läuft die Maus in die Irre. Ihre Koordinaten orientieren sich immer noch am Bildschirm, nicht aber am JPanel. Ich habe den Koordinatenursprung nun mit der Bildschirmgröße und der JPanel-Größe neu berechnet. Allerdings traue ich dem Braten nicht ganz, die Titelleiste muss z. B. auch berücksichtigt werden, sie schiebt das Bild (in diesem Falle) nach unten, und deren Maße können sich ja auch ändern.

Gibt es eine elegantere Möglichkeit, die Maus auf die linke obere Ecke des JPanels "einzunullen" ?


----------



## Marco13 (4. Okt 2010)

Hmhm. Den MouseListener an das Panel hängen (und nicht etwa an den Frame oder so...)....


----------



## Kanitrino (4. Okt 2010)

Ach so... Du einst also, einfach den Mouse Listener in die JPanel-Klasse einbauen, die dann zum Zeichnen des Panels verwendet wird ?
Hört sich doch ganz einfach an, muss ich ausprobieren.


----------



## Marco13 (4. Okt 2010)

Nun, die Implementierung (also die eigentliche MouseListener-Klasse selbst) kann liegen wo sie will - auch in einer anderen Datei und so (falls du das meintests). Wichtig ist eben, dass man
panel.addMouseListener(mouseListener);
aufruft, und nicht
irgendwasAnderesWoDasPanelDrinIst.addMouseListener(mouseListener);


----------



## Kanitrino (5. Okt 2010)

Hallo Marco,

Ich hab's ausprobiert, es funktioniert.
Vielen Dank nochmal !


----------

