Erstellen eines Brettspiel-Layouts mit JLayeredPane

Lesezeit: 5 Minuten

Ich habe eine Aufgabe, bei der ich im Rahmen der Entwicklung eines Spiels das Layout erstellen muss, das Sie auf dem Bild sehen. Ich habe noch nie mit Java für Desktop-Anwendungen gearbeitet, also bin ich ein absoluter Noob, wenn es um die Verwendung der Swing- und AWT-Bibliotheken geht. Das Bild schlägt vor, dass wir ein JLayeredPane als unseren Root-Container verwenden und dann den Rest darüber hinzufügen. Mein Problem ist, dass ich versucht habe, mit dem Hintergrundbild und dem GridLayout zu beginnen, aber ich kann anscheinend nichts anderes als den Hintergrund anzeigen lassen. Das Raster wird überhaupt nicht angezeigt (keine Grenzlinie, kein Hintergrund der Zellen) und alle anderen Komponenten, die ich hinzugefügt habe, sind fehlgeschlagen. Kann mich hier jemand in die richtige Richtung weisen? Ich habe die Dokumentation gelesen und einige Beispiele für verschiedene Layouts, Container und Komponenten gesehen, aber ich kann anscheinend nicht alle zusammenarbeiten lassen.

Hier mein bisheriger Code:

public class BoardView  extends JFrame{


// Constructor
public BoardView() {
    JFrame window = new JFrame("Sorry Game"); // create a new Jwindow instance
    ImageIcon appIcon = new ImageIcon(getClass().getClassLoader().getResource("res/icon.png")); // create the icon for the app
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // when the 'X' button is clicked, the app stops
    window.setSize(new Dimension(1000, 700)); // setting the size of the window
    window.setResizable(false); // Window won't be resizable
    window.setIconImage(appIcon.getImage()); // set the icon for the app
    window.setLayout(new BorderLayout());
    JLayeredPane layeredPane = new JLayeredPane();
    JLabel background = new JLabel();
    background.setSize(1000,700);
    background.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/background.png")));  for the JLabel
    layeredPane.add(background,0);

    JPanel gridPanel = new JPanel(new GridLayout(16,16));
    gridPanel.setSize(650,700);
    layeredPane.add(gridPanel);

    for(int i = 0; i < 256; i++) {
        JLabel tile = new JLabel();
        tile.setBackground(Color.red);
        tile.setBorder(new LineBorder(Color.black));
        gridPanel.add(tile);
    }

    JLabel logo = new JLabel();
    logo.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/sorryImage.png")));
    layeredPane.add(logo);
    window.add(layeredPane);
    window.setLocationRelativeTo(null); // centers the window to the screen
    window.setVisible(true); // make the window visible
}
}

Mein Denkprozess war, dass ich das Layout des JFrame auf ein BorderLayout setzen könnte, damit ich das endgültige Layout in zwei Teile zerlegen kann, den westlichen und den östlichen. Das westliche würde das Grid und die verschiedenen JLabels und Buttons enthalten und das östliche würde den Rest der Komponenten enthalten. Ich habe versucht, die zu verwenden BorderLayout.WEST & EAST Parameter beim Hinzufügen von Komponenten zum JFrame, aber keiner hat funktioniert oder etwas geändert. Ich habe auch versucht, einen Index für die Tiefe zu verwenden, wenn ich Komponenten zum JLayeredPane gemäß den Dokumenten hinzufüge, aber auch hier ändert sich nichts.

PS Bitte beachten Sie, dass ich niemanden suche, der das Layout für mich erstellt. Ich möchte, dass mir jemand hilft zu verstehen, was ich falsch mache und wie man solche Layouts am besten erstellt.

Attrappe, Lehrmodell, Simulation

  • Ich würde damit beginnen, den Abschnitt aus dem Swing-Tutorial zu lesen So verwenden Sie geschichtete Fenster für ein grundlegendes Beispiel. Der Code zeigt Ihnen, wie Sie Ihre Klasse besser strukturieren können (Sie sollten JFrame nicht für eine Sache erweitern). Ein mehrschichtiger Bereich verwendet ein Null-Layout, sodass Sie die Grenzen jeder Komponente festlegen müssen. Wenn Sie ein BorderLayout verwenden, fügen Sie normalerweise die Hauptkomponente zum CENTER hinzu, damit es den für den Rahmen verfügbaren Platz einnehmen kann.

    – camickr

    23. November 2019 um 17:39 Uhr

  • @camickr das hat wirklich geholfen, danke! Ich habe Fortschritte gemacht. Noch eine Frage zur Sicherheit. Um die Zellen des Rasters zu initialisieren, in denen ich Bilder haben möchte, muss ich sie nicht manuell an diesen Positionen hinzufügen?

    – Stelios Papamicail

    24. November 2019 um 12:31 Uhr

Um die Zellen des Rasters zu initialisieren, in denen ich Bilder haben möchte, muss ich sie nicht manuell an diesen Positionen hinzufügen?

Wenn Sie eine verwenden GridLayout Jede Zelle muss eine Komponente haben und die Komponenten müssen der Reihe nach hinzugefügt werden. Das heißt, wenn Komponenten hinzugefügt werden, werden sie nach Bedarf automatisch in die nächste Reihe umgebrochen.

Selbst wenn Sie also kein Bild in einer Zelle haben möchten, müssen Sie eine Dummy-Komponente hinzufügen, sagen wir ein JLabel ohne Text/Symbol.

Ein einfacherer Ansatz könnte die Verwendung von a sein GridBagLayout. Die GridBagLayout kann so konfiguriert werden, dass Platz für Zellen “reserviert” wird, die keine Komponenten haben. So können Sie einer bestimmten Zelle eine Komponente hinzufügen.

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;

public class GridBagLayoutSparse extends JPanel
{
    public GridBagLayoutSparse()
    {
        setBorder( new LineBorder(Color.RED) );

        GridBagLayout gbl = new GridBagLayout();
        setLayout( gbl );
/*
    //  Set up a grid with 5 rows and columns.
        //  The minimimum width of a column is 50 pixels
        //  and the minimum height of a row is 20 pixels.

        int[] columns = new int[5];
        Arrays.fill(columns, 50);
        gbl.columnWidths = columns;

        int[] rows = new int[5];
        Arrays.fill(rows, 20);
        gbl.rowHeights = rows;
*/
        //  Add components to the grid at top/left and bottom/right

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;

        gbc.gridx = 0;
        gbc.gridy = 0;
        addLabel("Cell 0:0", gbc);

        gbc.gridx = 3;
        gbc.gridy = 4;
        addLabel("Cell 3:4", gbc);
    }

    private void addLabel(String text, GridBagConstraints gbc)
    {
        JLabel label = new JLabel(text);
        label.setBorder( new LineBorder(Color.BLUE) );

        add(label, gbc);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("GridBagLayoutSparse");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout( new GridBagLayout() );
        frame.add(new GridBagLayoutSparse());
        frame.setSize(300, 300);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}
  1. Führen Sie den Code so aus, wie er ist, und die Komponenten werden in der Mitte zusammengefasst.
  2. Entkommentieren Sie den Blockkommentar und führen Sie ihn erneut aus. Die Komponenten werden in der entsprechenden Zelle positioniert.

994520cookie-checkErstellen eines Brettspiel-Layouts mit JLayeredPane

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy