2014-01-29 4 views
1

Я пытаюсь переместить прямоугольник, нарисованный Graphics2D, но он просто не работает. Когда я делаю x + = 1; Он фактически перемещает его на 1 пиксель и останавливается. если я говорю, x + = 200; Он перемещает его на 200 пикселей по сравнению с ONCE не в каждом обновлении, а ONCE.Java - Как переместить прямоугольник, который нарисован Graphics2D?

public void paint(Graphics g) 
{ 
    super.paint(g); 

    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, this.getWidth(), this.getHeight()); 

    g.setColor(Color.RED); 
    g.fillRect(x, 350, 50, 50); 

    x += 1; 
} 

INT х называется вне ничтожной краски, чтобы убедиться, что он не увеличивается в 150 каждый раз. Рисует отлично, просто не двигается, я пытался использовать поток и использовать цикл while, пока поток работает, он движется, но не повезло.

+0

Опубликовать больше кода для нас – Xabster

+0

Как вы вызываете 'repaint()'? – Holger

+0

Взгляните на [** Как перемещать прямоугольник по экрану с помощью key bindingd **] (http://stackoverflow.com/a/20844242/2587435). Это должно помочь вам. –

ответ

2

Вместо использования цикла while или другого потока вы должны использовать java.swing.Timer для анимации. Вот основная конструкция

Timer(int delay, ActionListener listener) 

, где задержка времени вы хотите быть отсрочена между перерисовкой и listener является слушателем с функцией обратного вызова для выполнения. Вы могли бы сделать что-то вроде этого, где вы измените x местоположение, а затем вызвать repaint();

ActionListener listener = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
      if (x >= D_W) { 
       x = 0; 
       drawPanel.repaint(); 
      } else { 
       x += 10; 
       drawPanel.repaint(); 
      } 
     } 
    }; 
    Timer timer = new Timer(250, listener); 
    timer.start(); 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class KeyBindings extends JFrame { 

    private static final int D_W = 500; 
    private static final int D_H = 200; 
    int x = 0; 
    int y = 0; 

    DrawPanel drawPanel = new DrawPanel(); 

    public KeyBindings() { 
     ActionListener listener = new AbstractAction() { 
      public void actionPerformed(ActionEvent e) { 
       if (x >= D_W) { 
        x = 0; 
        drawPanel.repaint(); 
       } else { 
        x += 10; 
        drawPanel.repaint(); 
       } 
      } 
     }; 
     Timer timer = new Timer(100, listener); 
     timer.start(); 
     add(drawPanel); 

     pack(); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private class DrawPanel extends JPanel { 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.GREEN); 
      g.fillRect(x, y, 50, 50); 
     } 

     public Dimension getPreferredSize() { 
      return new Dimension(D_W, D_H); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new KeyBindings(); 
      } 
     }); 
    } 
} 

enter image description here

Вот бегущий пример

0

Использование аффинных преобразований. Просто используя класс AffineTransform, вы можете перевести графический объект по экрану по оси x или y.

Вот ссылка с информацией о классе и его функции и т.д .: https://docs.oracle.com/javase/8/docs/api/java/awt/geom/AffineTransform.html

Вот еще один сайт, который даст вам примеры по переводу, а также другие преобразования: http://zetcode.com/gfx/java2d/transformations/

И когда увеличивающиеся х или y для перевода, вы должны вызвать функцию repaint(), чтобы перерисовать графический объект.

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