GridBagLayout Ideen

PHPler

Grünschnabel
Hallo,

ich habe ein JPanel, das ich auf ein JFrame setze. Dieses JPanel ist mit dem GridBagLayout bestückt. Jedoch will das noch nicht ganz so, wie ich will.

Mittlererweile bin ich so weit, das ich die Positionierung der Elemente zueinander schon soweit ganz gut heraus habe, jedoch in der Position des ganzen ist mir das ganze noch nicht so, wie ich es mir dachte.

Desweiteren will ich davon loskommen, die Platzhalter mit "leeren" JPaneln zu füllen und will von diesen weg, sodass die ganzen Gitterzellen, wo ich nichts haben will dann später auch wirklich leer sind, da ich mit einem Hintergrundbild das ganze etwas verschönern will und die leeren JPanels da störend im Bild sind. Funktioniert das ganze vielleicht mit Constraint insets besser?

Nun zu der Klasse:
Code:
public class StartScreen extends JPanel {

    public StartScreen() {
        setLayout(new GridBagLayout());
        setSize(new Dimension(1024, 768));
        setPreferredSize(new Dimension(1024, 768));


        /**
         * create space objects
         */
        JPanel leftSpacePnl = new JPanel();
        JPanel topSpacePnl = new JPanel();
        JPanel centerSpacePnl = new JPanel();
        JPanel bottomSpacePnl = new JPanel();
        JLabel gameDescLbl = new JLabel("test");

        /**
         * set space object options
         */
        topSpacePnl.add(gameDescLbl);
        gameDescLbl.setFont(new Font("Arial", Font.BOLD, 45));


        /**
         * create layout objects
         */
        JButton startBtn = new JButton("Start Game", null /* icon */);
        JButton exitBtn = new JButton("Exit Game", null /* icon */);

        /**
         * create default constraint settings
         */
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.insets = new Insets(2, 2, 2, 2);

        /*
         * c.gridx          sagt, welches die erste überdeckte Zelle von links her ist
         * c.gridy          sagt, welches die erste überdeckte Zelle von oben her ist
         * c.gridwidth      wieviele Zellen in horizontaler Richtung überdeckt werden
         * c.gridheight     wieviele Zellen in vertikaler Richtung überdeckt werden
         */


        /**
         * add space objects
         */
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1.0;
        c.gridwidth = 6;
        add(topSpacePnl, c);

        c.gridx = 0;
        c.gridy = 1;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 0.1;
        add(leftSpacePnl, c);

        c.gridx = 2;
        c.gridy = 1;
        c.gridheight = 5;
        c.weightx = 0.3;
        add(centerSpacePnl, c);

        c.gridx = 0;
        c.gridy = 6;
        c.gridheight = 1;
        c.gridwidth = 6;
        c.weightx = 1;
        add(bottomSpacePnl, c);

        /**
         * add layout objects
         */
        c.gridx = 1;
        c.gridy = 1;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.weightx = 0.2;
        add(startBtn, c);

        c.gridx = 1;
        c.gridy = 3;
        add(exitBtn, c);

        c.gridx = 3;
        c.gridy = 1;
        c.weightx = 0.4;
        add(new JLabel("Highscore"), c);

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        /*if (Configuration.GAME_BACKGROUND_IMAGE_PATH != null) {
            g.drawImage(new ImageIcon(Configuration.GAME_BACKGROUND_IMAGE_PATH).getImage(), 0, 0, this);*/
        }
    }
}

Das ganze platziere ich auf einem JFrame (auch 1024,768):
Code:
add(new StartScreen(), BorderLayout.PAGE_START);

Zu den angehängten Bildern:

Im Moment ist es so wie auf bild1.jpg, dass das ganze einfach mitten im eigentlichen Fenster ist, es soll aber so wie auf bild 2, am Rand platziert werden. Die größenverhältnisse einfach mal ignorieren, das hab ich mal schnell verkleinert nur und eingepasst, für das bild.

Sollte ich vielleicht nicht das GridBagLayout benutzen? Welche alternativen hätte ich dann?

Vielen Dank schon einmal für die hoffentlich kommenden Ratschläge.

Gruß
Daniel
 

Anhänge

  • bild1.jpg
    bild1.jpg
    10,9 KB · Aufrufe: 10
  • bild2.jpg
    bild2.jpg
    21,7 KB · Aufrufe: 16
Hi,

ich würde es versuchen so zu lösen.
als Haupt-Layout -> BorderLayout

Dann entweder direkt mit BoxLayout arbeiten, die lassen sich sehr gut positionieren und man kann simple Leer-Räume erstellen ohne weitere Panels einzubinden. Die Boxen also quasi in die Border-Ausrichtungen platzieren, wie Border.LINE_START und Border.CENTER

Evtl. würde ich noch ein Grid-Layout in Border.CENTER platzieren und dann BoxLayout jeweils in die Gridspalten einfügen. Hängt davon ab wie viele Spalten quasi notwendig sind. Mit dem Border-Layout kann man da schon locker 3 Spalten nutzen ohne weitere Layouts einzubinden.

Gruß Marc
 
Wow, ein guter Gedanke.

Ich schau mir mal an, wie das ganze aussieht, wenn ich es so umsetze. Mit dem BoxLayout habe ich noch nicht gearbeitet bisher, das muss ich mir auch noch einmal genauer ansehen dann.

Danke dir.

EDIT:
Also ich hab das ganze jetzt doch mit dem GridBagLayout gelöst, so wie oben, dann hab ich auf die Panels, die vorher im Weg waren ein setOpaque(false); angewendet, sodass diese Transparent sind und die Panels noch mit setSize(Dimension) und setPreferredSize(Dimension) eine feste größe zugewiesen, damit sich das ganze im Fenster etwas schiebt.

Das wars auch schon ;)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück