RPG Programmieren, label.setLocation funktioniert nicht

Hag2bard

Bekanntes Mitglied
Hallo nochmal,

es geht mal wieder um mein Pokemon Projekt.

Ich habe mein Spielfeld noch nicht fertig, aber das ist erstmal irrelevant.

Java:
package pokemon;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainView2 extends JFrame {

    public BufferedImage img = null;

    private BufferedImage img2;
    Bob bob = new Bob(); // Lade Projekt Bob
    Ash ash = new Ash(); //lade ash

    public MainView2() {

        ImageIcon imageIcon = bob.getImageIcon(bob.bild());
        ImageIcon charakter = ash.getImageIcon(ash.ash);

        JLabel label = new JLabel(imageIcon);
        JLabel labelChar = new JLabel(charakter);
        JPanel panel = new JPanel();
        panel.add(label);
        panel.add(labelChar);

        labelChar.setLocation(500,500);
        this.add(panel);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Bild laden bei Swing");
        this.setSize(800, 860);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}

Der Code ist noch nicht gesäubert, ist im Grunde nur ein Experiment.
Ich erstelle ein ImageIcon aus einem BufferedImage. Dies soll das Spielfeld sein.
Nun erstelle ich ein weiteres ImageIcon (charakter) dies soll die Spielfigur sein.

Dann erstelle ich ein Label und füge das Spielfeld ImageIcon ein.
Dann erstelle ich ein Panel und füge das Label da ein.
Anschließend füge ich das Panel zum JFrame hinzu.

Das funktioniert soweit einwandfrei, aber wie ihr in dem Code seht, mache ich noch was anderes.
Ich erstelle ein weiteres JLabel indem ich ImageIcon (des Charakters) einfüge.
Anschließend füge ich dieses JLabel dem Panel hinzu.

Ergebnis:

bla.png

Das Spielfeld ist wie gesagt noch nicht fertig.
Der Charakter ist nun irgendwo im Bild.
Die Methode labelChar.setLocation(500,500); hat keine Auswirkung auf die Positon des Charakters.

Was habe ich falsch gemacht?

Danke im Voraus
 

mihe7

Top Contributor
Ein Panel hat standardmäßig einen LayoutManager (FlowLayout), der die Komponenten platziert. panel.setLayout(null) könnte helfen.
 

Hag2bard

Bekanntes Mitglied
Wenn ich den LayoutManager vom Panel auf null setze, bekomme ich kein Bild mehr

1635001376267.png


Java:
package pokemon;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainView2 extends JFrame {

    public BufferedImage img = null;

    private BufferedImage img2;
    Bob bob = new Bob(); // Lade Projekt Bob
    Ash ash = new Ash(); // Lade Ash

    public MainView2() {

        ImageIcon imageIcon = bob.getImageIcon(bob.bild());
        ImageIcon charakter = ash.getImageIcon(ash.ash);

        JLabel label = new JLabel(imageIcon);
        JLabel labelChar = new JLabel(charakter);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.add(label);

       // panel.add(labelChar);

        this.add(panel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Bild laden bei Swing");
        this.setSize(800, 860);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}
 

mihe7

Top Contributor
Du musst beim null-Layout auch die Größe der Elemente festlegen, mit setBounds dürfte es am einfachsten funktionieren.
 
K

kneitzel

Gast
Mein Vorschlag hier wäre eh: Bau alles aus einem einzigen Bild auf. Sprich: du erstellst ein BufferedImage mit der Größe der Client Bereiches und das baust du dann regelmäßig neu auf. Wenn sich etwas verändert z.B.

Der UI Thread muss also immer nur das aktuelle Bild anzeigen und wir sehr einfach.

Was du dann aber noch hast ist eine Logik, die halt sicher stellt, dass du mit mund. zwei Bildern arbeitest: ein Bild wird gerade angezeigt und ein anderes Bild wird gerade vom Spiel Thread neu erzeugt. Wenn ein Bild neu erzeugt wurde, dann wird es dem UI Thread zur Verfügung gestellt und ein Reprint wird aufgerufen. Wenn der UI Thread das neue Bild nimmt, dann wird das alte Bild frei und kann wieder verwendet werden.

Das ist die Logik, die ich in der Regel verwende. Auch um ein flackern und so zu vermeiden.
 

Hag2bard

Bekanntes Mitglied
Vielen Dank für die Antworten,

Ok, also nochmal für Dumme zum Mitschreiben:

Also ist folgende Idee performancetechnisch gut?:

Ich habe ein BufferedImage mit der Map, welches so bleibt. (mapImage)
Dann habe ich ein weiteres BufferedImage (showedImage) , welchem ich das mapImage zuweise und darauf dann meinen Charakter BufferedImage zeichne, je nachdem welche Position ich gerade möchte.
Wenn sich der Charakter durch ein Tastendruck auf z.b. rechts um 1 Feld nach rechts bewegt, dann weise ich dem showedImage wieder das mapImage zu und zeichne darauf dann meinen Charakter an der neuen Position.

Ist das so richtig?

Und wenn ich dann den Charakter noch animieren möchte (ich hab 3 Bilder, bei einem steht er, bei einem ist der linke Fuß vorne, beim anderen der rechte) dann mache ich also folgendes:

showedImage mit Charakter an Position 400x400 (16 Pixel = 1 Block)
showedImage wird zurückgesetzt (showedImage = mapImage)
showedImage mit Charakter an Position 408x400 (mit rechtem Fuß vorne)
showedImage wird zurückgesetzt (showedImage = mapImage)
showedImage mit Charakter an Position 416x400 (Charakter steht)

Ist das so in Ordnung?
Ich dachte es wäre performanter ein JLabel zu bewegen anstatt immer wieder das BufferedImage zu zeichnen.

Dann würde ich jetzt erstmal im Laufe der nächsten Zeit meine Map fertig stellen, schauen dass ich die Charakter Bilder habe (3 Stück pro Richtung) und dann müsste ich euch nochmal fragen, wie ich das ganze mit den Threads aufbaue.
 

mihe7

Top Contributor
Ich dachte es wäre performanter ein JLabel zu bewegen anstatt immer wieder das BufferedImage zu zeichnen.
Das wäre duchaus denkbar. Swing optimiert durchaus das Zeichnen von dirty-Regions, ich weiß allerdings nicht, ob JLabel das auch unterstützt. Daher würde ich das selbst implementieren.

Und wenn ich dann den Charakter noch animieren möchte (ich hab 3 Bilder, bei einem steht er, bei einem ist der linke Fuß vorne, beim anderen der rechte) dann mache ich also folgendes:
Du zeichnest einfach von hinten nach vorne, also zuerst das Hintergrundbild, dann was "auf" dem Hintergrundbild liegt. Bei einer Animation kannst Du repaint ein Rechteck mitgeben, dann hast Du den betreffenden Ausschnitt und musst nur diesen neu zeichnen.
 

Neumi5694

Top Contributor
Performancetechnisch bist du besser dran, wenn du direkt ins Bild zeichnest, sobald sich die Position ändert.
Swing-Komponenten kommen da performancetechnisch nicht ran, die machen noch eine Menge mehr. Das Positionieren eines JLabels löst eine Menge Events aus, im Label selbst, im Ancestor und wahrscheinlich auch in allen Sub-Kompenenten des Ancestors.

Bei dem, was du hier vorhast, fällt das alles aber nicht ins Gewicht. Mach das, was weniger Aufwand ist.
Oder aber bau für das Ganze mal einen Wrapper, der die Methoden bietet, die du ansprechen willst (positionieren, Auslösen von Neuzeichnen z.B.). Darin verwende erst mal ein JLabel. Falls die Performance nicht passt, kannst du dann dort immer noch was schnelleres implementieren, ohne den eigentlichen Spielcode zu ändern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Swing Kugel/Sphäre programmieren AWT, Swing, JavaFX & SWT 12
H LayoutManager RPG Programmieren, eigenes Spielfeld grafisch generieren aus Tileset AWT, Swing, JavaFX & SWT 18
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
T Wie kann man in java aufwendige grafiken programmieren AWT, Swing, JavaFX & SWT 1
A 2D-Grafik Sprung programmieren AWT, Swing, JavaFX & SWT 35
M Nutzer interface Programmieren AWT, Swing, JavaFX & SWT 2
J Kleines Helikopterspiel programmieren AWT, Swing, JavaFX & SWT 2
R kleinen JPanelEditor programmieren AWT, Swing, JavaFX & SWT 3
C Gesucht: Hilfe beim programmieren. AWT, Swing, JavaFX & SWT 1
C Hilfe beim programmieren mit studiumgebundenes Projekt AWT, Swing, JavaFX & SWT 1
2 Senso bzw SimonSays programmieren AWT, Swing, JavaFX & SWT 8
T Möchte Android-ähnlich programmieren AWT, Swing, JavaFX & SWT 7
R Eclipse GUI Programmieren AWT, Swing, JavaFX & SWT 8
I LookAndFeel HTML Auflösung - Online Editor programmieren AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Menü programmieren AWT, Swing, JavaFX & SWT 2
J Swing Landkarte mithilfe von Swing programmieren AWT, Swing, JavaFX & SWT 4
T Kleinen "Gui Builder" programmieren AWT, Swing, JavaFX & SWT 12
SexyPenny90 Wie Ball programmieren, der im 4 Eck rum fliegt AWT, Swing, JavaFX & SWT 7
I Rechner programmieren AWT, Swing, JavaFX & SWT 6
F UI Toolkit programmieren AWT, Swing, JavaFX & SWT 9
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
S Desktop Programmieren AWT, Swing, JavaFX & SWT 2
A Programmieren einer Agenda mit einer Liste (als Applet und .txt zum Speichern) AWT, Swing, JavaFX & SWT 7
C Swing Orderbook programmieren AWT, Swing, JavaFX & SWT 6
B Editor programmieren AWT, Swing, JavaFX & SWT 26
LittleJavaCup Suchmaschine programmieren (wie bei Windows) AWT, Swing, JavaFX & SWT 2
T AWT verschiedene Oberflächen programmieren AWT, Swing, JavaFX & SWT 5
vandread Swing Probleme mit "Game of Life" programmieren AWT, Swing, JavaFX & SWT 8
J Modelleisenbahn - Kontroll-Tafel programmieren AWT, Swing, JavaFX & SWT 3
L Regler in Java Programmieren AWT, Swing, JavaFX & SWT 12
I Preisvergleich programmieren AWT, Swing, JavaFX & SWT 4
P Swing Roter Faden beim Applet GUI Programmieren AWT, Swing, JavaFX & SWT 2
J FAQ programmieren, welche Swing-Elemente AWT, Swing, JavaFX & SWT 7
G GUI - Inhalte wechseln (Eingabe-Assistenten programmieren) AWT, Swing, JavaFX & SWT 2
C Zeitplaner: Terminblock programmieren AWT, Swing, JavaFX & SWT 7
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
izoards Ausdruck auf Label Drucker AWT, Swing, JavaFX & SWT 1
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
I BoxLayout zentriert Label nicht AWT, Swing, JavaFX & SWT 7
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
R JavaFX Label oder Imageview anzeigen mit Buttonklick AWT, Swing, JavaFX & SWT 4
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
A Inhalt wechseln bei Klick auf Label AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
Trèfle JavaFX Formattierung im Label AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
F Countdown in Label anzeigen AWT, Swing, JavaFX & SWT 14
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1
J Dateiname im Label einblenden AWT, Swing, JavaFX & SWT 4
C SWT autosize bei gc.drawString() auf einem Label AWT, Swing, JavaFX & SWT 7
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann NullPointerException bei Label.setText() AWT, Swing, JavaFX & SWT 5
T JavaFX Label mit mehreren Images AWT, Swing, JavaFX & SWT 11
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
L JavaFX ContextMenu bei Label mit Linksklick AWT, Swing, JavaFX & SWT 4
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
N Anordnung der Label AWT, Swing, JavaFX & SWT 3
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
D JavaFX Label lässt sich nicht mehrmals färben AWT, Swing, JavaFX & SWT 7
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
T CSS Rechtsbüdniges Label mit Zwei Zeilen AWT, Swing, JavaFX & SWT 7
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
C Textfeld und Label werden nicht angezeigt (Ubuntu) AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
Augenblau JavaFX Wechselnde Werte in Label darstellen AWT, Swing, JavaFX & SWT 7
V Swing Brauche Hilfe mit Label AWT, Swing, JavaFX & SWT 3
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
B Swing JXMapKit Mausemove in Label anzeigen AWT, Swing, JavaFX & SWT 0
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
G Label wird nicht erstellt AWT, Swing, JavaFX & SWT 0
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
G Label erstellen AWT, Swing, JavaFX & SWT 6
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
F JavaFX label.getWidth() AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
N Input/Output Stream werte in Label anzeigen. AWT, Swing, JavaFX & SWT 6
R JavaFX Label ändern in aufgerufener AnchorPane AWT, Swing, JavaFX & SWT 3
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
G JavaFX CSS: Label in GridPane rechts ausrichten AWT, Swing, JavaFX & SWT 9
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
KrokoDiehl Swing Buchstaben im Label anders färben AWT, Swing, JavaFX & SWT 4
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben