Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide camembert rotatif

    21 novembre 2016 à 23:09:18

    Bonjour,

    je suis en train de développer une petite application pour faire un simili de roue de la fortune.

    J'utilise donc le fillArc() de Graphics de la lib awt par manque de connaissance. 

    J'arrive à faire la roue mais 2 problème se posent à moi.

    Le premier comment mettre un texte à l'intérieur des fillArc.

    Le deuxième comment faire pour faire tourner la roue et l’arrêter.

    Si vous avez plus simple que ce que j'ai évoqué, n'hésitez pas !!!

    Merci d'avance pour vos réponse

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2016 à 9:10:59

      Hello,

      un panel avec un label et un cercle puis rotate ?

      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2016 à 20:29:17

        Le label doit rester au même endroit sur l'arc donc j'aurais besoin de plus d'élément que ça.

        Pour la rotation, il me faut faire une rotation continue qui s’arrête au bout d'un moment avec un effet de décélération, du coup j'ai du mal à voir comment le faire avec ce que tu as envoyé car la rotation est immédiate si j'ai tout compris

        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2016 à 9:18:33

          Un objet roue qui se dessine avec un panel qui contient un un cercle et des labels. En pivotant ton panel, tu fais pivoter tout son contenu donc les label.

          Pour faire une rotation progressive, il faut faire une animation d'une suite de rotation (la fréquence de l'animation augmentant ou ralentissant selon l'impression que tu cherches à donner)

          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2016 à 19:23:07

            Oui je comprend ce que tu veux dire mais mettre le label sur la bonne part j'ai un peut de mal à voir comment faire.

            Concernant l'animation, je ne connait pas du tout comment la faire.

            Si tu as des liens exemples, je te remercierais beaucoup.

            C'est des exemples concret qu'il me manque je ne connais que le awt, swing basique. Je suis dev back à la base donc j'ai un peu de mal sans exemple à voir concrètement ce que ça fait

            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2016 à 20:11:56

              Désolé mais je n'ai pas de lien d'exemple.

              Chaque composant possède une position XY, à toi de l'utiliser pour positionner tes JLabel.

              Si tu as une question précise, je peux t'aider mais dans l’état actuel, je ne peux pas faire plus.

              A la limite montre ton code pour voir.

              • Partager sur Facebook
              • Partager sur Twitter
                23 novembre 2016 à 20:32:34

                Le code est pas très avancer parce que justement j'ai du mal à modéliser la première partie à savoir la roue avec le texte

                public class Roue extends JPanel{
                    
                    
                    @Override
                    public void paintComponent(Graphics g){
                        super.paintComponent(g);
                        g.setColor(Color.yellow);
                        g.fillArc(170, 200, 200, 200, 0, 180);
                        g.setColor(Color.blue);
                        g.drawString("test", 170, 200);
                        g.fillArc(170, 200, 200, 200, 180, 180);
                        drawTriangle(g);
                        
                //        g.fillOval(100, 100, 100, 100);
                    }
                
                    private void drawTriangle(Graphics g) {
                        Triangle t = new Triangle(20, 20, 40, 40, 60, 20);
                        t.dessiner(g);
                    }
                
                    public static void main(String[] args) {
                //        Tartelette tpc = new Tartelette();
                //        tpc.setVisible(true);
                
                            Roue t = new Roue();
                            
                            JFrame jf = new JFrame();
                                jf.setSize(1000, 1000);
                                jf.setVisible(true);
                                jf.add(t);
                    }



                -
                Edité par Jordan Botrel 23 novembre 2016 à 20:37:58

                • Partager sur Facebook
                • Partager sur Twitter
                  24 novembre 2016 à 9:19:10

                  <humour>Ah, ces dev backend, uniquement bon à faire un CRUD ! </humour>

                  Découpe ta logique en classe:

                     1: une fenetre

                     2: un socle(partie fixe de ta roue) du style le pointeur qui déterminera sur quelle zone tu tombes

                     3: une roue (partie qui tourne) avec texte

                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 décembre 2016 à 15:42:41

                    me revoilà sur un autre problème.

                    La rotation de ma roue s'efface et se redessine.

                    le code de la rotation

                    void paintRotation(Graphics graphics, int angle) {
                            super.paintComponent(graphics);
                            Graphics2D g2d = (Graphics2D) graphics;
                            g2d.rotate(Math.toRadians(angle), X+TAILLE/2, Y+TAILLE/2);
                            paintComponent(graphics);
                        }


                    le code du timer 

                       this.timer = new Timer(10, new ActionListener() {
                                private int angle = 0;
                                
                                @Override
                                public void actionPerformed(ActionEvent ae) {
                                    this.angle += 1;
                                    if (this.angle == 360) {
                                      this.angle = 0;
                          }
                                    roue.paintRotation(roue.getGraphics(), angle);
                    
                                }
                            }
                            );


                    des idées de pourquoi ça blink ?

                    -
                    Edité par Jordan Botrel 3 décembre 2016 à 17:11:00

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 décembre 2016 à 19:28:02

                      import java.awt.Color;
                      import java.awt.Graphics;
                      import java.awt.Graphics2D;
                      import java.awt.event.ActionEvent;
                      import java.awt.event.ActionListener;
                      import java.awt.geom.Ellipse2D;
                      
                      import javax.swing.JFrame;
                      import javax.swing.JPanel;
                      import javax.swing.Timer;
                      
                      public class Roue extends JPanel implements ActionListener{
                      
                      	public static final int TAILLE = 50;
                      	public static final int X=0;
                      	public static final int Y=0;
                      	
                      	private int angle;
                      	private Timer timer;
                      	public Roue() {
                      		super();
                      		this.angle = 0;
                      		this.timer = new Timer(100,this );
                      		this.timer.start();
                      	}
                      
                      	@Override
                      	public void paintComponent(Graphics g) {
                      		System.out.println("paint");
                      		super.paintComponent(g);
                      		Graphics2D g2d = (Graphics2D) g;
                      		g2d.rotate(Math.toRadians(angle),100, 100);
                      		g.setColor(Color.yellow);
                      		g.fillArc(0, 0, 200, 200, 0, 180);
                      		g.setColor(Color.blue);
                      		g.drawString("test", 170, 200);
                      		g.fillArc(0, 0, 200, 200, 180, 180);
                      	}
                      
                      	public static void main(String[] args) {
                      		Roue t = new Roue();
                      		JFrame jf = new JFrame();
                      		jf.setSize(1000, 1000);
                      		jf.setVisible(true);
                      		jf.add(t);
                      
                      	}
                      
                      	@Override
                      	public void actionPerformed(ActionEvent e) {
                      		angle=(angle+5)%360;
                              System.out.println(angle);
                              repaint();
                      	}
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 décembre 2016 à 13:19:26

                        Modification impeccable, j'aurais du y penser avant :p

                        Dernier problème pour cette appli (ça avance mine de rien)

                        écrire du texte sur une part du camembert.

                        Actuellement je fait un fillArc pour la part et je rajoute le texte à tâtons avec le drawString. 

                        private void drawPart(Graphics2D g2d, int startAngle, int angleDeb, List<Object> colonne) {
                            Color couleur = (Color) colonne.get(2);
                            int poid = (int) colonne.get(1);
                        
                            g2d.setColor(couleur);
                            g2d.fillArc(X, Y, TAILLE, TAILLE, angleDeb, startAngle*poid);
                        
                            drawTexte(g2d, colonne);
                        }
                        
                        private void drawTexte(Graphics2D g2d, List<Object> colonne) {
                            String texte = (String) colonne.get(0);
                        
                        
                            Font currentFont = g2d.getFont();
                            currentFont.deriveFont(15F);
                            g2d.setFont(currentFont);
                        
                            AffineTransform old = g2d.getTransform();
                            g2d.rotate(Math.toRadians(-90), 500, 425);
                        
                            g2d.drawString(texte, 500, 425);
                            g2d.setTransform(old);
                        }

                         Avez-vous une meilleur solution, autre que celle-ci parce qu'il faut que je fasse des calculs pour bien placer le texte.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 décembre 2016 à 14:15:29

                          Et bien tu as un angle et une distance (plus petite que le rayon)

                          à partir de la, tu as des coordonnées polaires que tu dois convertir en coordonnées cartésiennes (x,y) pour pouvoir positionner.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 décembre 2016 à 14:44:39

                            Du coup pas le choix va falloir que je fasse quelque mathématique :p
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 décembre 2016 à 14:59:46

                              import java.awt.Color;
                              import java.awt.Graphics;
                              import java.awt.Graphics2D;
                              import java.awt.event.ActionEvent;
                              import java.awt.event.ActionListener;
                              import java.awt.geom.Ellipse2D;
                               
                              import javax.swing.JFrame;
                              import javax.swing.JPanel;
                              import javax.swing.Timer;
                               
                              public class Roue extends JPanel implements ActionListener{
                               
                                  public static final int TAILLE = 50;
                                  public static final int X=0;
                                  public static final int Y=0;
                                   
                                  private int angle;
                                  private Timer timer;
                                  public Roue() {
                                      super();
                                      this.angle = 0;
                                      this.timer = new Timer(100,this );
                                      this.timer.start();
                                  }
                               
                                  @Override
                                  public void paintComponent(Graphics g) {
                                      super.paintComponent(g);
                                      Graphics2D g2d = (Graphics2D) g;
                                      g2d.rotate(Math.toRadians(angle),100, 100);
                                      for(int i=0;i<10;i++){
                                      	if(i%2 == 0){
                                      		g.setColor(Color.yellow);
                                      	}else{
                                      		g.setColor(Color.blue);
                                      	}
                                      	int from = i*360/10;
                                      	g.fillArc(0, 0, 200, 200, from, (int) ((1/10.0)*360));       	
                                      }
                                      for(int i=0;i<10;i++){
                                      	int from = (int) (i*360/10+0.5*360/10);
                                      	g.setColor(Color.BLACK);
                                      	int r = 90;
                                      	int xString = (int) (Math.cos(from)*r);
                                      	int yString = (int) (Math.sin(from)*r);
                                      	g.drawString(""+i, xString+100, yString+100);
                                      }
                              
                                  }
                                  
                                  public static void main(String[] args) {
                                      Roue t = new Roue();
                                      JFrame jf = new JFrame();
                                      jf.setSize(1000, 1000);
                                      jf.setVisible(true);
                                      jf.add(t);
                               
                                  }
                               
                                  @Override
                                  public void actionPerformed(ActionEvent e) {
                                      angle=(angle+5)%360;
                                      repaint();
                                  }
                              }

                               J'ai un peu de mal à centrer les textes par contre



                              -
                              Edité par ukusan 12 décembre 2016 à 15:00:23

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Aide camembert rotatif

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown