2016-11-26 13 views
0

Ich wollte ein kleines Bild bewegen. Es ist ein ImageIcon in einem JLabel. Mein Plan war es, einen JButton zu drücken, der eine while-Schleife ausführt, die ihn jede zweite 50px nach rechts bewegt.JLabel bewegt sich nicht

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 



public class Game extends JFrame implements ActionListener{ 

JButton jbUUp; 
JButton jbUDw; 
JButton jbUSh; 


public static ImageIcon shot; 
public static ImageIcon spL; 
public static ImageIcon spR; 

public static JLabel LspL; 
public static JLabel LspR; 
public static JLabel Lshot; 

public static int shPosUser = 150; 
public static int shPosKI = 150; 
public static int shXPosUser = 180; 


Game(){setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(1000, 500); 
     getContentPane().setBackground(Color.WHITE); 

     spR = new ImageIcon("src/spR.jpg"); 
     LspR = new JLabel(spR); 
     LspR.setSize(170, 170); 
     LspR.setLocation(820, shPosKI); 
     LspR.setVisible(true); 

     spL = new ImageIcon("src/spL.jpg"); 
     LspL = new JLabel(spL); 
     LspL.setSize(170, 170); 
     LspL.setLocation(10, shPosUser); 
     LspL.setVisible(true); 

     shot = new ImageIcon("src/shot.gif"); 
     Lshot = new JLabel(shot); 
     Lshot.setSize(21, 15); 
     Lshot.setLocation(shXPosUser, shPosUser + 77); 
     Lshot.setVisible(false); 

     jbUUp = new JButton("U"); 
     jbUUp.setSize(60, 30); 
     jbUUp.setLocation(10, 350); 
     jbUUp.addActionListener(this); 

     jbUDw = new JButton("D"); 
     jbUDw.setSize(60, 30); 
     jbUDw.setLocation(10, 420); 
     jbUDw.addActionListener(this); 

     jbUSh = new JButton("S"); 
     jbUSh.setSize(60, 30); 
     jbUSh.setLocation(10, 385); 
     jbUSh.addActionListener(this); 

     add(LspR); 
     add(LspL); 
     add(Lshot); 
     add(jbUUp); 
     add(jbUDw); 
     add(jbUSh); 
     } 

public void actionPerformed(ActionEvent e){if(e.getSource() == jbUUp){User.moveUp();} 

              if(e.getSource() == jbUDw){User.moveDown();} 

              if(e.getSource() == jbUSh){User.shot();} 
              } 





} 

Dies sind die beiden Klassen

public class User { 

User(){} 

public static void moveUp(){Game.shPosUser = Game.shPosUser - 10; 
          Game.LspL.setLocation(10, Game.shPosUser);} 

public static void moveDown(){Game.shPosUser = Game.shPosUser + 10; 
           Game.LspL.setLocation(10, Game.shPosUser);} 

public static void shot(){Game.Lshot.setVisible(true); 
          while(Game.shXPosUser < 500){timeout(1000); 
                 Game.shXPosUser = Game.shXPosUser + 50; 
                 System.out.println(Game.shXPosUser); 
                 Game.Lshot.setLocation(Game.shXPosUser, Game.shPosUser); 
                 } 
          Game.Lshot.setVisible(false); 
          Game.shXPosUser = 180; 
          Game.Lshot.setLocation(Game.shXPosUser, Game.shPosUser); 
          } 

public static void timeout(int time){try{Thread.sleep(time);} 
            catch(Exception e){} 
           } 

} 

Nun mein Problem ist, dass das Bild nicht bewegt. Die Koordinaten werden geändert, aber nicht verschoben.

+0

* "Ich wollte ein kleines Bild bewegen. Es ist ein ImageIcon in einem JLabel. Mein Plan war es, einen JButton zu drücken, der eine While-Schleife ausführt." * Ich schlage einen neuen Plan vor. Passen Sie das Bild in einem 'JPanel' an, das' paintComponent (Graphics) 'überschreibt. Das Verschieben einer Komponente ist keine empfohlene Methode zur Animation. Besonders wenn es darum geht, mehr als ein visuelles Element auf dem Bildschirm zu animieren. Der obige Code lädt eine Vielzahl von Bildern. Wenn sie sich in Komponenten in einem Null-Layout befinden, ist das Verhalten nicht definiert, wenn sie sich überlappen. (Ist ein Grund, die Wiedergabe hier vollständig zu steuern.) –

Antwort

1

Sie müssen den Rahmen neu streichen, um Änderungen zu sehen, also rufen Sie repaint() Methode von JFrame an, um die UI zu aktualisieren.

zum Beispiel

if(e.getSource() == jbUUp){ 
    User.moveUp(); 
    repaint(); 
} 

Hoffe, es wird funktionieren.

+0

Es gibt keinen Grund, also rufe repaint() auf. Wenn Sie eine Eigenschaft einer Komponente ändern (z. B. setLocation), wird die Komponente automatisch repaint(). – camickr

1

Die JLabel ist bewegt. Der Bildschirm wird nicht neu gezeichnet, sodass die neue Position von JLabel nicht angezeigt werden kann. Irgendwo in der Spiel-Datei müssen Sie repaint(); aufrufen, um den Bildschirm neu zu streichen;

+0

Ich bin mir auch nicht sicher, ob das, was ELITE vorgeschlagen hat, funktionieren wird. Wenn man bedenkt, dass die while-Schleife die Ausführung des Threads blockiert, bis der Benutzer die Bewegung beendet hat, glaube ich nicht, dass Repaint bis dahin aufgerufen wird. Damit es erfolgreich neu gezeichnet werden kann, müssen Sie das Repaint von der While-Schleife aus aufrufen. – EKW

+0

Es gibt keinen Grund, also rufen Sie repaint() auf. Wenn Sie eine Eigenschaft einer Komponente ändern (z. B. setLocation), wird die Komponente automatisch repaint(). – camickr

1

Zu allererst:

  1. Beitrag richtig formatiert Code, wenn Sie eine Frage stellen. Die Einrückung Ihres Codes ist überall. Wenn Sie möchten, dass wir uns die Zeit nehmen, Ihren Code zu lesen, stellen Sie sicher, dass der Code lesbar ist.

  2. Entfernen Sie alle statischen Variablen. So sollte das statische Schlüsselwort nicht verwendet werden.

  3. Befolgen Sie die Java-Namenskonventionen. Variablennamen sollten NICHT mit einem Großbuchstaben beginnen.

Mein Plan war es, eine JButton Ausführung einer while-Schleife wich drücken bewegt er jede Sekunde 50px nach rechts

Sie können eine while-Schleife verwenden. Das Thread.sleep() innerhalb der Schleife verhindert, dass sich die GUI selbst neu erstellt, bis die Schleife beendet ist. In diesem Fall wird das Symbol nur an seiner endgültigen Position angezeigt.

Die Lösung ist eine Swing Timer zu verwenden. Der Timer generiert ein Ereignis, zu dem Sie den neuen Standort berechnen können. Sie müssen dann den Timer stoppen, wenn die Animation beendet werden soll.

Lesen Sie den Abschnitt aus dem Swing-Tutorial auf How to Use Swing Timers für weitere Informationen.