Swing Startbild wird nicht gezeichnet

_qwertz

Mitglied
Hallo Leute, ich habe ein kleines Problem.
Und zwar folgendes: Wir beschäftigen uns in der Schule mit einem Projekt ("interner Wettbewerb") das einen Ski-Lauf verwalten soll.
Ich habe es zwar hinbekommen, dass ich zwischen 2 JPanels hin und her wechseln kann, und dann auch mein Bild gezeichnet wird, jedoch wird dieses Startbild nicht beim aller ersten Aufruf des Programms gezeichnet (wie ich es gerne hätte) :(
Wäre schön, wenn ihr mir helfen könntet :)

Hier der Starter (da wir mit BlueJ arbeiten):
Java:
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.Dimension;

public class Starter
{
    private Spiel meinSpiel;

    public static void main(String[] args)
    {
        new Starter();
    }
    
    public Starter()
    {
        meinSpiel = new Spiel();
        meinSpiel.setSize(1000, 800);
        centerWindow(meinSpiel);
        meinSpiel.setVisible(true);
        meinSpiel.setAnfangsPanel();
    }
    
    public void centerWindow(Window window)
    {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = window.getSize();
        
        if (frameSize.height > screenSize.height)
        {
            frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width)
        {
            frameSize.width = screenSize.width;
        }
        
        window.setLocation( (screenSize.width - frameSize.width) / 2,
                            (screenSize.height - frameSize.height) / 2
                          );
    }
}

Und hier die GUI:
Java:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.BorderLayout;

public class Spiel extends JFrame
{
    private AnfangsPanel anfangsPanel   = new AnfangsPanel(Toolkit.getDefaultToolkit().getImage("Bilder\\schnee.jpg"));
    private JPanel spielerPanel         = new JPanel();
    
    private BorderLayout myBorderLayout = new BorderLayout();
    
    private JMenuBar meineMenuBar       = new JMenuBar();
    
    private JMenu SpielMenu             = new JMenu("Spiel");
    private JMenu SpielerMenu           = new JMenu("Spieler");
    private JMenu RanglisteMenu         = new JMenu("Rangliste");
    
    private JMenuItem startMenuItem     = new JMenuItem("Lauf starten");    //Spiel-Menu
    private JMenuItem neustartMenuItem  = new JMenuItem("Neustart");        //Spiel-Menu
    private JMenuItem beendenMenuItem   = new JMenuItem("Beenden");         //Spiel-Menu
    private JMenuItem anmeldenMenuItem  = new JMenuItem("anmelden");        //Spieler-Menu
    private JMenuItem abmeldenMenuItem  = new JMenuItem("abmelden");        //Spieler-Menu
    private JMenuItem nextRunMenuItem   = new JMenuItem("nächster Lauf");   //Rangliste-Menu
    private JMenuItem gesamtMenuItem    = new JMenuItem("Platzierung");     //Rangliste-Menu
    
    private JLabel jLabelName           = new JLabel();
    private JTextField nameTF           = new JTextField();
    private JButton anmelden            = new JButton();
     
    public Spiel()
    {
        Controller myController = new Controller(this);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(myBorderLayout);
        anfangsPanel.setLayout(null);
        spielerPanel.setLayout(null);
        
        setJMenuBar(meineMenuBar);
        meineMenuBar.add(SpielMenu);
        meineMenuBar.add(SpielerMenu);
        meineMenuBar.add(RanglisteMenu);
        
        SpielMenu.add(startMenuItem);
        SpielMenu.add(neustartMenuItem);
        SpielMenu.add(beendenMenuItem);
        SpielerMenu.add(anmeldenMenuItem);
        SpielerMenu.add(abmeldenMenuItem);
        RanglisteMenu.add(nextRunMenuItem);
        RanglisteMenu.add(gesamtMenuItem);
        
        startMenuItem.setActionCommand("start");            //Action Command
        startMenuItem.addActionListener(myController);
        neustartMenuItem.setActionCommand("neustart");      //Action Command
        neustartMenuItem.addActionListener(myController);
        beendenMenuItem.setActionCommand("beenden");        //Action Command
        beendenMenuItem.addActionListener(myController);
        anmeldenMenuItem.setActionCommand("switch anmelden");   //Action-Command
        anmeldenMenuItem.addActionListener(myController);
        abmeldenMenuItem.setActionCommand("abmelden");      //Action-Command
        abmeldenMenuItem.addActionListener(myController);
        nextRunMenuItem.setActionCommand("Liste next");     //Action-Command
        nextRunMenuItem.addActionListener(myController);
        gesamtMenuItem.setActionCommand("Liste gesamt");    //Action-Command
        gesamtMenuItem.addActionListener(myController);
        
        jLabelName.setText("Name");
        jLabelName.setBounds(new Rectangle(10, 80, 50, 20));
        
        nameTF.setBounds(new Rectangle(55, 75, 150, 30));
        
        anmelden.setBounds(new Rectangle(270, 75, 150, 30));
        anmelden.setText("Spieler anmelden");
        anmelden.setActionCommand("spieler anmelden");      //Action-Command
        anmelden.addActionListener(myController);
        
        spielerPanel.setBackground(Color.gray);
        spielerPanel.add(jLabelName, null);
        spielerPanel.add(nameTF, null);
        spielerPanel.add(anmelden, null);
    }
   
    public JTextField getNameTF()
    {
        return nameTF;      
    }
    
    public void setAnfangsPanel()
    {
        this.getContentPane().add(anfangsPanel, BorderLayout.CENTER);
        spielerPanel.setVisible(false);
        anfangsPanel.setVisible(true);
    }
    
    public void setSpielerPanel()
    {
        this.getContentPane().add(spielerPanel, BorderLayout.CENTER);
        anfangsPanel.setVisible(false);
        spielerPanel.setVisible(true);
    }
    
    class AnfangsPanel extends JPanel
    {
        private Image image;
        
        AnfangsPanel(Image image)
        {
            this.image = image;
            repaint();
        }
        
        @Override
        protected void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(image, -100, -100, null);
        }
    }
}

Im Anhang noch das zu ladende Startbild -- wie gesagt, es klappt schon, jedoch erst, wenn ich 1-mal hin und her geschaltet habe :(
 

Anhänge

  • schnee.jpg
    schnee.jpg
    98,5 KB · Aufrufe: 25

Marco13

Top Contributor
Nur kurz überflogen: Die ganzen "pauschalen" irgendeineComponent.setVisible(true) sollten überflüssig sein. Dafür sollte aber das frame.setVisible(true) erst GANZ am Ende gemacht werden, wenn alle anderen Components schon richtig platziert sind und so (also speziell: NACH setAnfangsPanel)
 

_qwertz

Mitglied
Hey, schonmal danke für die schnelle Antwort.
Ich habe den Konstruktor im Starter geändert:

Java:
public Starter()
    {
        meinSpiel = new Spiel();
        meinSpiel.setSize(1000, 800);
        centerWindow(meinSpiel);
        meinSpiel.setAnfangsPanel();
        meinSpiel.setVisible(true);
    }

Klappt leider immer noch nicht mit dem AnfangsBild.
Ohne die setVisibles funktioniert das switchen nicht gescheit.

Edit: Ich schaue mir mal deinen Link an, danke :)
Hast du eine Idee, warum das Startbild am Anfang nicht gezeichnet wird?
 
S

SlaterB

Gast
verwende
> new ImageIcon("test.jpg").getImage()
zum Laden

und
> meinSpiel.setAnfangsPanel();
> meinSpiel.setVisible(true);
statt andersrum


falls die GUI schon zu sehen ist, schreibe bei Änderungen wie das Hinzufügen von Komponenten
validate();
repaint();
 

Network

Top Contributor
Vieleicht mal mit repaint() versuchen?

Ich meine im Grunde passiert ja, dass dein JPanel gezeichnet wird, aber das Bild darauf nicht.
Erst wenn du einmal umswitcht (2mal oder? hin und wieder zurück)
Das Programm zeichnet beim Switchen deine beiden Panels nochmal neu...
 

_qwertz

Mitglied
SlaterB: Danke, das mit dem ImageIcon war der entscheidende Tipp.
Habs geändert, jetzt klappts es. Kannst du mir auch erklären, warum?

@All: Danke für die Antworten, ich melde mich beim nächsten Problem ;)
 
S

SlaterB

Gast
Bilder müssen erst in Java geladen werden, da gibt es noch mehr als die zwei Wege, da gibt es verschiedene Bildformate die zu verstehen sind,
verschiede Image-Repräsentation in Java, Pixel für Pixel oder anderes,

vor allem werden aber Bilder teils nebenläufig geladen, sind erst nach einigen ms verfügbar, vorher ist das Objekt zwar schon da, liefert aber Höhe/Breite -1

lauter grausige Geschichten, eine Horror-Klasse für mich ist seit jeher
MediaTracker (Java Platform SE 6)

wahrscheinlich letztlich alles verständlich, wenn man es sich nur mal genauer anschauen würde,
solange bleibt mein Verständnis, dass new ImageIcon("test.jpg") am besten lädt, aber z.B. für gif nicht geeignet ist

edit:
ok, new ImageIcon() verwendet im Quellcode auch Toolkit.getDefaultToolkit() und dann einen MediaTracker und wartet,
im Grunde einfach, jaja
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Wenn man mit dem Toolkit ein Bild lädt, wird das Bild praktisch "im Hintergrund" geladen. D.h. das Programm läuft schon weiter (und baut das AnfangsPanel, und zeigt es an...) bevor das Bild fertig geladen ist.
Man kann das machen, was SlaterB geschrieben hat. Alternativ dazu könnte man mit einem MediaTracker (Java Platform SE 6) darauf warten, dass das Bild fertig geladen ist. Oder man lädt es mit ImageIO (Java Platform SE 6) ...

EDIT: Etwas zu langsam. Aber ja: Das mit dem MediaTracker ist (für ein einzelnes Bild) unnötig umständlich. Beim ImageIcon ist AFAIR der MediaTracker schon mit eingebaut. Aber ImageIO kann man sich auf jeden Fall mal ansehen.
 

_qwertz

Mitglied
Ok, das habe ich auch schon irgendwo gelesen, und habe deshalb einen Thread.sleep(2000) hinter dem Laden des Bildes gebaut. Hat aber auch nichts gebracht^^

-- Ich verstehe jetzt zwar, wo der Fehler lag, aber nicht, was sich Java dabei gedacht hat, die Bilder (ohne diesen Media Tracker) asynchron zu laden...-.-

jeden Falls: Nochmal Danke! :)
 
Zuletzt bearbeitet:

Network

Top Contributor
Synchron arbeiten ist ein schönes Stichwort in der Informatik.

Programmcode wird von oben nach unten gelesen und ausgeführt (einfach gesagt).

Ein einfacher Ein-Kern-Prozessor kann auch nicht mehrere Befehle gleichzeitig ausführen sondern immer hintereinander.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
G JavaFX LineChart Datenpunkte Markierung wird abgeschnitten AWT, Swing, JavaFX & SWT 1
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
S Next_Button wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 6
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
J setOnCloseRequest wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
kodela BufferStrategy wird nicht gefunden AWT, Swing, JavaFX & SWT 5
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S ImageView wird dem Gridpane nicht zugefügt AWT, Swing, JavaFX & SWT 1
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
kodela Swing Letzte Änderung in der Tabelle wird nicht gespeichert AWT, Swing, JavaFX & SWT 5
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
S JavaFX Wird es überhaupt genutzt? AWT, Swing, JavaFX & SWT 3
FRI3ND GUI wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Wert in JTextField wird falsch ausgegeben AWT, Swing, JavaFX & SWT 2
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Aus welchen Grund wird der Button nicht angezeigt im GridPane? AWT, Swing, JavaFX & SWT 1
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
E Swing Liste in Scrollpane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Controller wird zu groß, was tun ? AWT, Swing, JavaFX & SWT 5
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Aktion ausführen wenn ein JRadiobutton deselektiert wird. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
zhermann JavaFX Main App wird nicht geöffnet AWT, Swing, JavaFX & SWT 6
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
M Swing Inhalt meines JTables wird falsch dargestellt AWT, Swing, JavaFX & SWT 8
T Default Table wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
K JavaFX Stage wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
X JavaFX AreaChart area höhe wird nicht richtig dargestellt AWT, Swing, JavaFX & SWT 2
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
S Swing Konstruktor wird nicht rechtzeitig fertig? AWT, Swing, JavaFX & SWT 4
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Liste - ListView wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
N JavaFX TextArea Updaten bevor Prozess gestartet wird AWT, Swing, JavaFX & SWT 7
B HBox wird nicht im Bottom angezeigt AWT, Swing, JavaFX & SWT 8
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben