IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Boules qui bougent dans Panel


Sujet :

AWT/Swing Java

  1. #1
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut Boules qui bougent dans Panel
    Bonjour,

    Alors voilà, j'aimerais réaliser une petite Applet en java.
    Une fenêtre, un bouton. Lorsque l'on clique sur le bouton, une boule se crée, se balade dans l'écran en rebondissant sur la fenêtre.

    Si l'on reclique sur le bouton, une boule se re-cré ... Indéfiniment.

    En fait, j'ai réussi à le faire, mais je suis même plutôt étonné que cela fonctionne. J'ai trouvé en tatônnant donc j'aimerais savoir s'il existe une méthode moins barbare. De plus j'ai un problème mini problème : Chaque boule bouge grâce à un Thread, ce qui permet de garder la fenêtre active.

    Lorsque la boule est la dernière cliquée, je suppose que le JPanel à toujours la capacité de connaître la taille de ma fenêtre.
    Si je clique de nouveau sur ajout de bouton et que je re-dimensionne ma fenêtre, seule la dernière boule va voir que la fenêtre est plus grande / petite et s'actualiser. Les autres ne remarquent plus le changement de fenêtre ...

    Place au code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.*;
     
    public class MainFrame extends JFrame implements ActionListener {
     
    	private JButton button = new JButton("Create !");
    	private JPanel panel = new JPanel();
    	private JPanel panelsud = new JPanel();
     
    	public MainFrame() {
    		this.setVisible(true);
    		this.setTitle("Moving Balls");
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		panel.setLayout(new BorderLayout());
    		panelsud.setLayout(new BorderLayout());
    		panel.add(panelsud, BorderLayout.SOUTH);
    		panelsud.add(button, BorderLayout.WEST);
    		panel.setBackground(Color.white);
    		button.addActionListener(this);
    		this.setContentPane(panel);
    		this.setSize(400, 400);
    		this.setLocationRelativeTo(null);
     
    	}
     
    	public void actionPerformed(ActionEvent arg0) {
     
    		Ball ball = new Ball();
    		panel.add(ball, BorderLayout.CENTER);
    		Thread thread = new Thread(ball);
    		thread.start();
    		panel.updateUI();
     
    	}
     
    }


    Voici comment se crée mon objet Ball :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.Random;
     
    import javax.swing.*;
     
    public class Ball extends JPanel implements Runnable {
    	private int x = (int) (Math.random() * 400);
    	private int y = (int) (Math.random() * 400);
    	private int width = (int) (Math.random() * 100);
    	private int prevx = x;
    	private int prevy = y;
    	private boolean moveX;
    	private boolean moveY;
    	private Color[] color = { Color.blue, Color.pink, Color.orange, Color.red,
    			Color.black, Color.cyan, Color.GREEN, Color.yellow };
    	private Color ColorDefinitive = color[(int) (Math.random() * color.length)];
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		g.setColor(Color.white);
    		g.fillOval(prevx, prevy, width, width);
    		g.setColor(ColorDefinitive);
    		g.fillOval(x, y, width, width);
    		prevx = x;
    		prevy = y;
     
    	}
     
    	private void move() {
     
    		while (true) {
     
    			if (x < 1)
    				moveX = true;
    			else if (x > this.getWidth() - 30)
    				moveX = false;
     
    			if (y < 1)
    				moveY = true;
     
    			else if (y > this.getHeight() - 30)
    				moveY = false;
     
    			if (moveX) {
     
    				x++;
     
    			} else {
    				x--;
     
    			}
     
    			if (moveY) {
     
    				y++;
     
    			} else {
    				y--;
     
    			}
    			this.repaint();
    			try {
    				Thread.sleep(10);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
     
    			}
     
    		}
     
    	}
     
    	public void run() {
    		move();
    	}
    }

    Voilà voilà, j'espère avoir un peu d'aide ici, car dans l'environnement où j'évolue, les mecs ont tout simplement décidé de ne pas faire l'exercice

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Tel que je comprends ton code, tu utilises un JPanel par boule, chaque JPanel placé au centre d'un BorderLayout.

    Or on ne peut placer qu'un panneau au centre de ce layout, et donc la dernière boule aura tendance à cacher les autres.

    Je te suggère de n'utiliser qu'un seul JPanel pour toutes les boules, de ne pas qualifier tes boules comme JPanel mais comme Ellipse2D.Double (par exemple), de les accumuler au fur et à mesure dans une ArrayList et en conservant leur position quelque part, puis de tous les reddissiner dans le paintComponent.

  3. #3
    Membre actif
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Par défaut
    Citation Envoyé par gifffftane Voir le message

    Or on ne peut placer qu'un panneau au centre de ce layout, et donc la dernière boule aura tendance à cacher les autres.
    C'est ce que je pensais aussi, mais quand je lance mon code, sa fonctionne ! Et en fait, je ne comprends pas comment cela peut fonctionner : La nouvelle boule devrait s'afficher a la place de l'ancienne, vu qu'elle se place au meme endroit dans mon JPanel. Donc au final, je devrais avoir qu'une seule boule qui s'affiche, non ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pas vraiment, dans un borderlayout, tu peut mettre plusieurs panneaux au centre, au milieu, ou tu veux. Seulement, la doc de BorderLayout ne donne de comportement explicite que pour 1 élément maximum par zone. Pour le reste, ce sont des effets de bord de l'implémentation sur lesquels tu devrais éviter de te baser.

Discussions similaires

  1. [WD-2010] Textes dans un tableau qui bougent
    Par Willvin dans le forum Word
    Réponses: 3
    Dernier message: 01/01/2015, 23h37
  2. voir comment est alimentée une vue qui est dans dba_objects
    Par meufeu dans le forum Administration
    Réponses: 15
    Dernier message: 06/10/2004, 17h27
  3. [Eclipse 2.1] des fichiers qui sautent dans WEB-INF/classes
    Par iubito dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/10/2004, 16h07
  4. Réponses: 10
    Dernier message: 10/06/2004, 16h20
  5. une méthode qui écrit dans la sortie html ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/12/2003, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo