2015-10-22 12 views
0

Я хочу создать несколько квадратов, которые движутся независимо друг от друга и в то же время, и я думаю, что наиболее эффективным способом является метод преобразования в Graphics2D, но я не уверен, как это сделать работа для каждого квадрата. Я хочу, чтобы квадратный объект был автономным и создавал свои собственные преобразования (экземпляры). Вот что я до сих пор.Как перемещать несколько объектов в JPanel

TransformPanel

import javax.swing.*; 
import java.awt.*; 
import java.awt.geom.AffineTransform; 
import java.util.Random; 
import java.util.concurrent.TimeUnit; 

public class TranformPanel extends JPanel { 
    private int[] xcoords = {250,248,253,255,249}; 
    private int[] ycoords = {250,253,249,245,250}; 
    private double randomx = 0; 
    private double randomy = 0; 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     drawTransform(g,randomx,randomy); 
    } 
    private void drawTransform(Graphics g,double randomx,double randomy) 
    { 
     Random rn = new Random(); 
     int xnum = rn.nextInt(10)-5; 
     randomx = xnum; 
     int ynum = rn.nextInt(10)-5; 
     randomy = ynum; 

     Rectangle rect = new Rectangle(250,250,10,10); 
     AffineTransform transform = new AffineTransform(); 
     Graphics2D g2d = (Graphics2D)g; 

     transform.translate(randomx,randomy); 
     g2d.draw(transform.createTransformedShape(rect)); 

     } 
    } 

TransformDraw

import java.awt.*; 
import javax.swing.*; 
import java.awt.geom.AffineTransform; 
import java.util.Scanner; 
import java.util.concurrent.TimeUnit; 

public class TransformDraw{ 
    private static TranformPanel panel = new TranformPanel(); 
    public static void main(String[] args) {  
     // Setup our JFrame details 
     JFrame frame = new JFrame(); 
     frame.setTitle("Transform Polygon Example"); 
     frame.setSize(500,500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 
     frame.setVisible(true); 
     frame.add(panel); 
     Scanner input = new Scanner(System.in); 
     for (int i=0;i<10;i++) 
     { 
     try { 
      TimeUnit.SECONDS.sleep(1); 
      frame.repaint(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      } 
     } 
    } 
} 

Спасибо это заранее!

+0

Создать класс, который знает, где один ящик, используйте это, чтобы нарисовать указанную коробку, когда вам нужно – MadProgrammer

+1

MadProgrammer- Просьба представить подробную информацию that.How бы отслеживать расположение ящика и мне нужно будет создать объект этого класса для каждого окна? Также, как бы я тогда преобразовал его местоположение? – Ninjaman494

ответ

0

Начните с создания чего-то, что может управлять его местонахождение (и другие свойства), и которые могут быть «окрашены»

public interface Box { 
    public void update(Dimension size); 
    public void paint(Graphics2D g2d); 
} 

Таким образом, это довольно простой, все это может сделать, это обновить (в пределах заданного площадь) и окрашиваться. Вы можете выставить другие свойства (как это ограничивающий прямоугольник, например) на основе ваших конкретных потребностей

Далее, нам нужна простая реализация, что-то вроде ...

public class DefaultBox implements Box { 

    private Color color; 
    private Rectangle bounds; 

    private int xDelta; 
    private int yDelta; 

    public DefaultBox(Color color, Dimension size) { 
     this.color = color; 
     bounds = new Rectangle(new Point(0, 0), size); 

     xDelta = 1 + (int) (Math.random() * 10); 
     yDelta = 1 + (int) (Math.random() * 10); 
    } 

    @Override 
    public void update(Dimension size) { 
     bounds.x += xDelta; 
     bounds.y += yDelta; 

     if (bounds.x < 0) { 
      bounds.x = 0; 
      xDelta *= -1; 
     } else if (bounds.x + bounds.width > size.width) { 
      bounds.x = size.width - bounds.width; 
      xDelta *= -1; 
     } 
     if (bounds.y < 0) { 
      bounds.y = 0; 
      yDelta *= -1; 
     } else if (bounds.y + bounds.height > size.height) { 
      bounds.y = size.height - bounds.height; 
      yDelta *= -1; 
     } 
    } 

    @Override 
    public void paint(Graphics2D g2d) { 
     g2d.setColor(color); 
     g2d.fill(bounds); 
    } 

} 

Теперь это поддерживает простой Rectangle экземпляр , который описывает местоположение и размер объекта, он также сохраняет свойства о цвете и его скорости.

Когда вызывается update, он обновляет его местоположение и выполняет некоторые простые проверки, чтобы убедиться, что поле остается в указанной области.

Когда вызывается paint, он просто красит себя.

Наконец, нам нужно каким-то образом, чтобы обновить и покрасить эти коробки ....

public class TestPane extends JPanel { 

    private List<Box> boxes; 
    private Color[] colors = {Color.RED, Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.WHITE, Color.YELLOW}; 

    public TestPane() { 
     boxes = new ArrayList<>(25); 
     for (int index = 0; index < 100; index++) { 
      Color color = colors[(int) (Math.random() * colors.length)]; 
      int width = 10 + (int) (Math.random() * 9); 
      int height = 10 + (int) (Math.random() * 9); 
      boxes.add(new DefaultBox(color, new Dimension(width, height))); 
     } 

     Timer timer = new Timer(40, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       for (Box box : boxes) { 
        box.update(getSize()); 
       } 
       repaint(); 
      } 
     }); 
     timer.start(); 
    } 

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

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (Box box : boxes) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      box.paint(g2d); 
      g2d.dispose(); 
     } 
    } 

} 

Итак, опять же, это довольно просто. Он поддерживает ListBox, a Swing Timer, чтобы периодически обновлять List от Box, вызывая их метод update. Timer просто вызывает repaint, который (в раунде вокруг) заканчивается вызовом paintComponent, который затем просто вызывает paint на каждом экземпляре Box.

100 коробок ...

100 Boxes

+0

Спасибо за разработку. Я скопировал и вставил код, но он не соответствует параметрам запуска решения Ecplise.Any. – Ninjaman494

+0

Я понятия не имею, что * «но он не соответствует параметрам запуска Ecplise» * означает, что я не использую Eclipse. Код будет компилироваться и запускаться из командной строки просто отлично, заметьте особенное о коде – MadProgrammer

+0

Не беспокойтесь об этом. Я просто глуп и забыл создать объект TestPanel в другом java-файле>.< – Ninjaman494

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