2012-12-08 1 views
1

Je sais que je suis un idiot et c'est pourquoi je ne peux pas le comprendre mais j'essaye de peindre un groupe de rectangles avec la taille et la position de randoms using le composant de peinture. J'essaie de m'assurer que tous sont peints dans le cadre. Je suis capable de le faire avec le code suivant (extrait) mais je me demande s'il y a une meilleure façon de le faire que des numéros en dur dans le programme. Y at-il une méthode que je devrais jeter un coup d'oeil à ce qui pourrait être ce que je cherche?Garder le rectangle dans JFrame

est ici la classe intérieure qui remplace la méthode paintComponent():

class DrawPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
     int red = (int)(Math.random()*256); 
     int blue = (int)(Math.random()*256); 
     int green = (int)(Math.random()*256); 

     g.setColor(new Color(red, blue, green)); 
     //The following 4 lines keep the rects within the frame 
     //The frame is 500,500 
     int ht = (int)(Math.random()*400); 
     int wd = (int)(Math.random()*400); 

     int x = (int)(Math.random()*100); 
     int y = (int)(Math.random()*100); 

     g.fillRect(x,y,ht,wd); 
    } 
} 
+0

Quels problèmes rencontrez-vous? Etes-vous sûr que vous voulez randomiser dans 'paintComponent (...)', de sorte que chaque fois que le GUI est repeint pour une raison quelconque, les rectangles vont changer. Et êtes-vous sûr que vous ne voulez pas appeler la méthode 'super.paintComponent (...)'? –

+1

De même, ne devriez-vous pas utiliser 'getSize()' du DrawPanel et ne pas utiliser la taille de JFrame? Sinon, vous ignorez sa barre de titre, etc ... –

+0

Voir les exemples connexes [ici] (http://stackoverflow.com/q/9849950/230513). – trashgod

Répondre

4

Vous devez baser vos coordonnées & tailles sur la taille des composants DrawPanel. En utilisant également Random.nextInt au lieu de Math.random() sera plus facile de garder à portée en fonction de la taille actuelle du panneau:

Random random = new Random(); 
int ht = random.nextInt(getHeight()); 
int wd = random.nextInt(getWidth()); 

int x = random.nextInt(getWidth() - wd); 
int y = random.nextInt(getHeight() - ht); 
+0

C'est ce que je cherchais. Merci beaucoup. J'ai également mis à l'écart toutes les autres réponses, car elles étaient toutes utiles, mais cela a réglé le «problème». –

4

Je me demande s'il y a une meilleure façon de le faire que moi chiffres hardcoding dans le programme.

Oui il y a

  • appel getSize() sur la enfermant JPanel, le DrawPanel, vous pouvez donc voir les limites réelles du composant qui est en cours d'élaboration sur. (edit: ou getWidth() et getHeight() comme recommandé par Lucas - 1+ à sa réponse!).
  • De plus, vous voudrez généralement appeler la méthode paintComponent(...) du super-utilisateur dans la commande prioritaire de l'enfant.
  • Aussi vous voudrez généralement faire votre randomisation ailleurs, comme dans le constructeur du DrawPanel afin de ne pas changer vos rectangles chaque fois que vous redimensionnez l'interface graphique.
+0

Pour ses fins, ne pas appeler getHeight() et getWidth() être mieux depuis getSize() renvoie une dimension? – Lucas

+0

@Lucas: soit pourrait bien fonctionner. 1+ à votre réponse d'ailleurs. –

+0

Certes, c'est un peu plus simple de le faire avec les méthodes séparées, mais plus rapide avec getSize() si vous savez ce que vous êtes. – Lucas

Questions connexes