2015-03-15 2 views
0

J'essaie de créer un programme avec Java en utilisant Graphics 2D qui peint les polygones entre 3 et 8 côtés et que je peux redimensionner avec un curseur mais je ne sais pas comment faire pour changer la taille avec le curseur uniformément.Comment est-ce que je peux changer la taille d'un chiffre fait dans Java Graphics2D avec un glisseur?

Voici un exemple de mon pentagone tiré

if (sides == 5){ 
     g.drawLine(110+x,135-y, 10+x,205-y); 
     g.drawLine(10+x,205-y, 48+x, 320-y); 
     g.drawLine(48+x,320-y, 170+x,320-y); 
     g.drawLine(170+x,320-y, 205+x,205-y); 
     g.drawLine(205+x,205-y, 110+x,135-y); 
    } 

Maintenant, je veux changer sa taille égale. (Je peux déplacer mon polygone dans les axes X et Y).

Merci d'avance.

+1

[ 'AffineTransformation'] (http : //docs.oracle.com/javase/tutorial/2d/advanced/transforming.html) – MadProgrammer

Répondre

2

Vous pourriez ...

Utilisez un AffineTransformation à l'échelle du Graphics contexte

Scale

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Test { 

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

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

       TestPane tp = new TestPane(); 

       JSlider slider = new JSlider(10, 200); 
       slider.addChangeListener(new ChangeListener() { 
        @Override 
        public void stateChanged(ChangeEvent e) { 
         tp.setScale(slider.getValue()); 
        } 
       }); 
       slider.setValue(100); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(tp); 
       frame.add(slider, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private int scale = 100; 

     public TestPane() { 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(250, 350); 
     } 

     public void setScale(int value) { 
      if (value != scale) { 
       int old = scale; 
       this.scale = value; 
       firePropertyChange("scale", old, scale); 
       repaint(); 
      } 
     } 

     public int getScale() { 
      return scale; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      double scaleValue = getScale()/100d; 
      System.out.println(scaleValue); 
      AffineTransform at = AffineTransform.getScaleInstance(scaleValue, scaleValue); 
      g2d.setTransform(at); 

      int x = 10; 
      int y = 10; 

      g2d.drawLine(110 + x, 135 - y, 10 + x, 205 - y); 
      g2d.drawLine(10 + x, 205 - y, 48 + x, 320 - y); 
      g2d.drawLine(48 + x, 320 - y, 170 + x, 320 - y); 
      g2d.drawLine(170 + x, 320 - y, 205 + x, 205 - y); 
      g2d.drawLine(205 + x, 205 - y, 110 + x, 135 - y); 
      g2d.dispose(); 
     } 

    } 

} 

Cela va à l'échelle à la fois la taille et la position que, ce qui peut ne pas être souhaitable ...

Vous pouvez ...

Utilisez plutôt l'API de forme 2D Graphics. Cela vous permettra de définir une forme, indépendamment et simplement la peindre selon vos besoins. L'avantage est que vous pouvez contrôler la transformation mieux, la transformation de l'échelle sans transformer la position

Scaled Shape

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Path2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Test { 

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

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

       TestPane tp = new TestPane(); 

       JSlider slider = new JSlider(10, 200); 
       slider.addChangeListener(new ChangeListener() { 
        @Override 
        public void stateChanged(ChangeEvent e) { 
         tp.setScale(slider.getValue()); 
        } 
       }); 
       slider.setValue(100); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(tp); 
       frame.add(slider, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private int scale = 100; 
     private PentegonShape pentegonShape; 

     public TestPane() { 
      pentegonShape = new PentegonShape(100, 100); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(250, 350); 
     } 

     public void setScale(int value) { 
      if (value != scale) { 
       int old = scale; 
       this.scale = value; 
       firePropertyChange("scale", old, scale); 
       repaint(); 
      } 
     } 

     public int getScale() { 
      return scale; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      int x = 10; 
      int y = 10; 

      double scaleValue = getScale()/100d; 
      Shape shape = AffineTransform.getScaleInstance(scaleValue, scaleValue).createTransformedShape(pentegonShape); 
      g2d.setTransform(AffineTransform.getTranslateInstance(x, y)); 
      g2d.draw(shape); 
      g2d.dispose(); 
     } 

    } 

    public class PentegonShape extends Path2D.Double { 

     public PentegonShape(double width, double height) { 
      moveTo(width/2, 0); 
      lineTo(width, height/3d); 
      lineTo((width/5d) * 4, height); 
      lineTo((width/5d), height); 
      lineTo(0, height/3d); 
      closePath(); 
     } 

    } 

} 

Jetez un oeil à 2D Graphics et Working with Geometry en particulier

+0

Cela fonctionne très bien. Mais c'est trop compliqué à mes connaissances. Je ne comprends pas très bien. Je vous remercie! – Arbelaju

+1

@Arbelaju Je ne comprends pas les maths, je sais juste que cela fonctionne: P – MadProgrammer

+0

Y at-il un moyen de le faire uniquement à travers Graphics2d, Graphics et AffineTransform? Ou peut-être utiliser un scalaire dans chaque point? – Arbelaju