2016-04-25 2 views
0

J'ai des problèmes. Je veux dessiner un rect sur mon JPanel qui est ajouté à mon contentPane JFrame. Je veux que x soit à un ensemble pos mais en déplaçant -x et en recommençant où + x commence. Si j'ai un JPanel de 800 x 400, je veux que le rext prenne en compte ces paramètres mais se déplace le long de la xaxis (x - Velx) en se repeignant en 800 et en continuant dans la direction - x. Je sais que ce n'est pas une information suffisante, aucun de mes livres que j'ai en contact avec ce que j'essaie de faire, donc je manque de terminologie appropriée.XMotion traitant de JComponents

+0

Ne me dérange vis, je vais commencer par les bases à nouveau et gratter la idée que j'avais en tête. Je n'ai pas de terminologie appropriée quant à ce que je cherche même. –

+0

Quelque chose comme [this] (http://stackoverflow.com/questions/13022754/java-bouncing-ball/13022788#13022788) ou [this] (http://stackoverflow.com/questions/16908418/paintcomponent-not- working/16908462 # 16908462)? – MadProgrammer

Répondre

1

// Voici un bon exemple de le faire

public class AnimatedBoat {

public static void main(String[] args) { 
    new AnimatedBoat(); 
} 

public AnimatedBoat() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      } 

      JFrame frame = new JFrame("Test"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 
      frame.add(new AnimationPane()); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 

    }); 
} 

public class AnimationPane extends JPanel { 

    private BufferedImage boat; 
    private int xPos = 0; 
    private int direction = 1; 

    public AnimationPane() { 
     try { 
      boat = ImageIO.read(new File("boat.png")); 
      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        xPos += direction; 
        // change directions off window width 
        if (xPos + boat.getWidth() > getWidth()) { 
         xPos = getWidth() - boat.getWidth(); 
         direction *= -1; 
        } else if (xPos < 0) { 
         xPos = 0; 
         direction *= -1; 
        } 
        repaint(); 
       } 

      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return boat == null ? super.getPreferredSize() : new Dimension(boat.getWidth() * 4, boat.getHeight()); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int y = getHeight() - boat.getHeight(); 
     g.drawImage(boat, xPos, y, this); 

    } 

} 

}

+0

Lifted, verbatim de [Comment déplacer une image (animation)?] (Http://stackoverflow.com/questions/14432816/how-to-move-an-image-animation/14436331#14436331) ou [J'essaie pour déplacer une balle dans l'applet en utilisant le fil, mais son ne bouge pas] (http://stackoverflow.com/questions/14456072/i-am-trying-to-move-a-ball-in-applet-using-thread-but- son-ne-bouge/14456808 # 14456808). Je pense que vous constaterez que ce genre de comportement n'est pas apprécié, car vous essayez d'améliorer votre réputation au détriment des autres. Si l'exemple est vraiment utile, alors la question devrait être fermée comme un duplicata – MadProgrammer

+0

Je déconseillerais aussi le vidage de code "aveugle" car il n'enseigne rien à l'OP, pourquoi utiliser un "Timer" Swing dans ce cas? Quels sont les avantages ou les inconvénients d'utiliser un 'JPanel' de cette façon? – MadProgrammer

+0

@MadProgrammer Je viens de trouver un exemple qui semblait être ce que le PO avait besoin d'un exemple de changement de direction. Je ne suis pas essayer de construire des points de réputation ceux qui viennent au fil du temps. Je suppose que je pourrais avoir juste commenté mais je ne peux pas parce que j'ai besoin de 50 rp pour corriger un commentaire pour le lier à un exemple. À aucun moment, je n'ai dit que c'était mon code, l'exemple et la forme open source. Désolé si vous n'appréciez pas moi d'essayer d'aider. Je voudrais que quelqu'un me donne un morceau de code à regarder, mais c'est juste mon opinion désolé si je vous ai offensé et la communauté. –