Mit Swing eine Grafische Oberfläche erstellen

Battleju

Aktives Mitglied
Ich habe vor ein spiel zu entwickeln, bei dem es einen Spieler gibt, der ein Haus vor Zombies verteidigen muss.
Grafisch habe ich das dann so realisiert, dass ich in einem JFrame Textfelder in einem GridLayout angeordnet habe, die dann ein Spielfeld ergeben. In diesen Textfeldern lasse ich dann Bilder painten.

Nun läuft das ganze so, dass die einzelnen leeren weißen Felder zu sehen sind. Auf den Koordinaten wo dann der Player steht ist dann Anstelle eines leeren Feldes das Bild des Spielers.
Jetzt möchte ich eine Umgebung hinzufügen, indem ich einfach ein Hintergrundbild in das Frame einfüge. Und das ist das Problem. Ich habe den Code dementsprechend bearbeitet. Jedoch gibt es weder ein Hintergrund zu sehen noch irgendwelche Fehlermeldungen die mir weiterhelfen.
Ich hoffe mir kann jemand helfen das Problem zu lösen.

Dann habe ich noch die Frage, ob es einfachere Grafiklösungen gibt, bzw. Grafiklösungen mit denen man mehr Möglichkeiten hat die Spielwelt grafisch darzustellen und trotzdem nicht viel schwieriger sind.

Hier ist der Code, der Fehlerhaft ist:
Code:
package swing;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import org.eclipse.jdt.annotation.Nullable;

import world.Koordinaten;
import world.Koordinaten.Ebene;
import world.MyWorldController;
import world.WeltAdapter;
import world.WorldObjekt;

/**
* Swing-Frame
*/
public class SwingWelt implements WeltAdapter {
    private static int mRows = 20;
    private static int mCols = 20;
    private static final int GAP = 0;
    private Map<Koordinaten, WorldComponent> mBasisWorldObjekts = new HashMap<>();
    private Map<Koordinaten, WorldComponent> mTopWorldObjekts = new HashMap<>();
    private MyWorldController mWorld;
    private BufferedImage imgObject;

    public SwingWelt() {
        this(mRows, mCols);
    }

    public SwingWelt(int rows, int cols) {
        try {
            imgObject = ImageIO.read(new File("src/textures/Background.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JFrame frame = new JFrame("Stack");
        JPanel mainPanel = new JPanel(new GridLayout(rows, cols, GAP, GAP)){
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (imgObject != null) {
                    g.drawImage(imgObject, 0, 0, 600, 600, null);
                }
            }
        };
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                Koordinaten koordinaten = new Koordinaten(row, col);
                WorldComponent textfield = (new WorldComponent(Ebene.Basis));
                mBasisWorldObjekts.put(koordinaten, textfield);
                textfield.setFocusable(false);
                mainPanel.add(textfield);
            }
        }
       
        
        mWorld = new MyWorldController(this, rows, cols);
        mainPanel.addKeyListener(new StackKeyListener(mWorld));
        mainPanel.setFocusable(true);
        mainPanel.requestFocusInWindow();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("Closed");
                // Alle laufenden WorldObjekte beenden
                mWorld.cancel();
                e.getWindow().dispose();
            }
        });
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    @Override
    public synchronized void notifyWorldChanged() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                for (int row = 0; row < mRows; row++) {
                    for (int col = 0; col < mCols; col++) {
                        for (Map.Entry<Koordinaten, WorldComponent> cursor : mBasisWorldObjekts.entrySet()) {
                            WorldObjekt obj = mWorld.getWorldObjekt(cursor.getKey());
                            WorldComponent field = cursor.getValue();
                            field.setWorldObjekt(obj);
                        }
                    }
                }
            }
        });
    }

    @Override
    public synchronized void notifyPositionChanged(Koordinaten koordinaten) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                @Nullable
                WorldObjekt obj = mWorld.getWorldObjekt(koordinaten);
                WorldComponent field;
                switch (koordinaten.EBENE) {
                case Top:
                    field = mTopWorldObjekts.get(koordinaten);
                    break;
                default:
                    obj = mWorld.getWorldObjekt(koordinaten);
                    field = mBasisWorldObjekts.get(koordinaten);
                }
                field.setWorldObjekt(obj);
            }
        });
    }
   
    private class TransparentTextField extends JTextField {
        Color mColor = new Color(0, 0, 0, 0);

        public TransparentTextField(String text) {
            super(text, 3);
            setHorizontalAlignment(JTextField.CENTER);
            setForeground(Color.RED);
            setBackground(mColor);
            setOpaque(false);
        }

        @Override
        public void paintComponent(Graphics g) {
            g.setColor(mColor);
            Rectangle r = g.getClipBounds();
            g.fillRect(r.x, r.y, r.width, r.height);
            super.paintComponent(g);
        }
    }
}

Danke für die Hilfe im voraus.

lg bttl
 

Blender3D

Top Contributor
Dann habe ich noch die Frage, ob es einfachere Grafiklösungen gibt, bzw. Grafiklösungen mit denen man mehr Möglichkeiten hat die Spielwelt grafisch darzustellen und trotzdem nicht viel schwieriger sind.
Eine wirklich flexible Lösung ist: Ein BufferdImage in das man alle Grafik Ausgaben macht und dieses nach jeder Änderung der Spielesituation neu zeichnen lässt.
Code:
public class GamePanel extends JPanel{
     private final GraphicsConfiguration gfxConf = GraphicsEnvironment
                          .getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
     private BufferedImage imageBuffer = null;

     @Override
     protected void paintComponent( Graphics g ){
         if( imageBuffer == null || imageBuffer.getWidth() != getWidth() || imageBuffer.getHeight() != getHeight() ){
             imageBuffer = gfxConf.createCompatibleImage( getWidth(), getHeight() );
         }
     g.drawImage( imageBuffer, 0, 0, this );
        }
     public void updateGraphics(){
         Graphics g = imageBuffer.createGraphics();
         // do grapical manipulation here.
         ..
         repaint();
     }
}
Das ist einfacher und flexibler als Dein Ansatz
;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Swing Component draggen Spiele- und Multimedia-Programmierung 25
Devil0s Swing Elemente für Inventar? Spiele- und Multimedia-Programmierung 9
K AWT oder Swing Spiele- und Multimedia-Programmierung 7
C Schiffe versenken mit Swing Spiele- und Multimedia-Programmierung 5
A Swing Komponenten aktiv neuzeichnen Spiele- und Multimedia-Programmierung 2
X Spiel mit Swing-Komponenten rendern Spiele- und Multimedia-Programmierung 11
T SWING ausreichend? (mittelkleines 2D-Spiel) Spiele- und Multimedia-Programmierung 8
T MouseControl : JME Canvas in Swing Gui Spiele- und Multimedia-Programmierung 7
T Nifty oder doch Swing ?! Spiele- und Multimedia-Programmierung 32
J Spiel mit Java SWING, LWJGL und JMonkey [Anfänger braucht Hilfe] Spiele- und Multimedia-Programmierung 10
E Animationen und Pfadinterpolation auf basis von Swing Spiele- und Multimedia-Programmierung 2
S Swing und VolatileImage Spiele- und Multimedia-Programmierung 20
ice-breaker [Swing] Isometrie Spiele- und Multimedia-Programmierung 5
J Java3D & Swing: JLabel auf Box positionieren? Spiele- und Multimedia-Programmierung 2
H Mausbewegungen wie eine echte Maus in 3 dimensionalen Spielen Spiele- und Multimedia-Programmierung 12
temi OpenGL: Eine Kugel Spiele- und Multimedia-Programmierung 7
Taknax Versuche eine Mod von 1.11.2 in 1.12.2 zu porten. Spiele- und Multimedia-Programmierung 1
J noch eine Runde spielen? Spiele- und Multimedia-Programmierung 6
K Wie bekomme ich eine Transition für alle Objekte zum stoppen? Spiele- und Multimedia-Programmierung 1
P Wie kann ich einem Programm hinter eine GUI verstecken? Spiele- und Multimedia-Programmierung 12
J Wie kann man eine grafische Oberfläche erzeugen um eine Textdatei auswählen zu können ?? Spiele- und Multimedia-Programmierung 1
D Iterieren durch einen Ordner mit Audiodateien und verketten eine andere Audiodatei Spiele- und Multimedia-Programmierung 17
C Eine eigene 3d Engine : Shader - aber wie ? Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
X Minecraft Wie kann ich eine Karte erstellen wie zb:(Bei Minecraft) Spiele- und Multimedia-Programmierung 1
M Wie kann man die Auflösung eine fertigen Programms ändern? Spiele- und Multimedia-Programmierung 1
Furtano Vektoren für Bewegung für eine 2D-Simulation Spiele- und Multimedia-Programmierung 3
TheSorm Collision an einer bestimmten Seite eine Rectangles abfragen Spiele- und Multimedia-Programmierung 3
T Sinusgenerator für eine Hp Spiele- und Multimedia-Programmierung 8
S eine nullpointerexception, wo sie nicht sein sollte Spiele- und Multimedia-Programmierung 12
N Webanwendung als eine Art Spiel Spiele- und Multimedia-Programmierung 8
M Eine Art "Vier Gewinnt" Spiele- und Multimedia-Programmierung 5
B j3d Rotation um mehr als eine Achse Spiele- und Multimedia-Programmierung 9
M Methoden eine Map zu zeichnen Spiele- und Multimedia-Programmierung 5
2 Eine Java App als Midi Device? Spiele- und Multimedia-Programmierung 2
W 3D-APIs für Java - Eine Übersicht Spiele- und Multimedia-Programmierung 8
M Wavefront Object Loader zeigt nur eine Textur an. Spiele- und Multimedia-Programmierung 7
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
R JLayer player spielt nur eine mp3 Datei ab Spiele- und Multimedia-Programmierung 1
M Variable die eine Klasse enthält ändern Problem Spiele- und Multimedia-Programmierung 16
G Was genau ist eine Grafikengine? Spiele- und Multimedia-Programmierung 14
radiac Mal eine ganz Doofe Frage... verzeiht :) Spiele- und Multimedia-Programmierung 9
Developer_X Eine Frage zur ViewBesetzung Spiele- und Multimedia-Programmierung 28
G Eine Art Polygon Spiele- und Multimedia-Programmierung 5
H Wie erzeuge ich eine Zufallszahl zwischen 0 und 8 ? Spiele- und Multimedia-Programmierung 7
B vertikal schreiben oder eine Bilddatei drehen? Spiele- und Multimedia-Programmierung 11
E nur eine Konzeptfrage Spiele- und Multimedia-Programmierung 11
G Ein begrenzter Zeitraum, um eine Eingabe zu tätigen! Spiele- und Multimedia-Programmierung 9
M mehrere PNG in eine Datei Spiele- und Multimedia-Programmierung 3
H Eine gestrichelte Linie Spiele- und Multimedia-Programmierung 3
V Wie bewege ich eine eingefügte Grafik (img) ? Spiele- und Multimedia-Programmierung 2
D Eigentlich eine Umfrage (Pausenanimation) Spiele- und Multimedia-Programmierung 4
morkuzz Grafische Oberfläche für Schachprogramm - Welche? Spiele- und Multimedia-Programmierung 6
C Grafische Darstellung der Mandelbrotmenge Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben