2015-03-15 3 views
0

Я пытаюсь сделать программу с java, используя Graphics 2D, которая рисует многоугольники между 3 и 8 сторонами и что я могу изменить размер с помощью слайдера, но я не знаю, как это сделать, чтобы изменить размер с помощью слайдера.Как изменить размер фигуры, сделанной в Java Graphics2D, с помощью слайдера?

Вот пример моего пятиугольника обращается

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); 
    } 

Теперь я хочу, чтобы равномерно изменить его размер. (Я могу переместить мой многоугольник по оси X и Y).

Заранее спасибо.

+1

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

ответ

2

Вы могли бы ...

Используйте AffineTransformation масштабировать Graphics Context

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(); 
     } 

    } 

} 

Это будет масштабировать и размер и положение, хотя, который не может быть желательным ...

Вы можете ...

Вместо этого используйте API-интерфейс 2D Graphics. Это позволит вам определить форму самостоятельно и просто покрасить ее по мере необходимости. Преимущество этого вы можете управлять преобразованием лучше, превращая масштаб без преобразования позиции

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(); 
     } 

    } 

} 

взглянуть на 2D Graphics и Working with Geometry в частности

+0

Он отлично работает. Но это слишком сложно для моего знания. Я так плохо понимаю. Спасибо! – Arbelaju

+1

@Arbelaju Я не понимаю математику, я просто знаю, что она работает: P – MadProgrammer

+0

Есть ли способ сделать это только через Graphics2d, Graphics и AffineTransform? Или, может быть, использовать скаляр в каждой точке? – Arbelaju

 Смежные вопросы

  • Нет связанных вопросов^_^