Panel zentrieren

Kanitrino

Bekanntes Mitglied
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 ?

Java:
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)
 
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
Code:
Box.createHorizontalStrut(50)
und entsprechende.
 
das wäre eine weitere Möglichkeit...wenn du nur auf deinem Panel1 was machen willst?

Java:
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);
    }
}
 
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...
 
Zuletzt bearbeitet:
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" ?
 
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.
 
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);
 

Neue Themen


Zurück
Oben