如何通过在Java中按一次键使形状移动



我在大学有一个任务,画一个椭圆,让它在屏幕上一步一步地移动,只按一次按钮。下面是我的代码:

public class Window extends JPanel {
private static Ellipse2D.Double Ellipse;
private JFrame frame;
public Window() {
    super();
    int width = 20;
    int height = 30;
    Ellipse = new Ellipse2D.Double(width, height, 100, 50);        
}
public Dimension getPreferredSize()
{
    return (new Dimension(frame.getWidth(), frame.getHeight()));
}
@Override
public void paintComponent(Graphics g) {
    super.paintComponents(g);
    Graphics2D brush = (Graphics2D) g;
    int width = getWidth();
    int height = getHeight();
    g.clearRect(0, 0, width, height);
    brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    brush.draw(Ellipse);
}
public class MoveCircle implements KeyListener, ActionListener {
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("Working on top!");
        double newX = 0; double newY = 0;
        if (e.getKeyCode() == Event.ENTER) {                
            for (int i = 0; i < 26; i ++)
            {
                System.out.println("Working on bottom!");
                newX = Ellipse.x + 10;
                Ellipse.x = newX;
                newY = Ellipse.y + 10;
                Ellipse.y = newY;   
                repaint();                  
            }                
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
    }
}
private void createAndDisplayGUI(Window window)
{
    frame = new JFrame();
    Container container = frame.getContentPane();       
    container.add(window);
    window.addKeyListener(new MoveCircle());        
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
    window.requestFocusInWindow();
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            Window window = new Window();
            window.createAndDisplayGUI(window);
        }
    });
}

}

虽然我每次都循环调用函数repaint(),但椭圆只是从原始点移动到上次迭代中定义的点,而不是在每次迭代中绘制椭圆的位置。是否有可能使用摆动计时器,使其在每次迭代中重新绘制椭圆?我将非常高兴得到帮助在这方面

你有两个问题:第一个是你的循环正在UI线程上运行。第二是你对重新粉刷的工作方式的误解。repaint所做的就是向UI线程添加一个请求来进行修复。它本身不会进行重漆。因此,如果您在UI线程上运行操作,多次调用它将不会产生任何影响。正如您所建议的,您可以使用Swing Timer修复此问题,正如我在

下面放置的那样。
ActionListener al = new ActionListener() {
  int iterations = 0;
  public void actionPerformed(ActionEvent ae) {
           if (iterations == 25) {
             timer.stop();
           }
           interations++;
           System.out.println("Working on bottom!");
            newX = Ellipse.x + 10;
            Ellipse.x = newX;
            newY = Ellipse.y + 10;
            Ellipse.y = newY;   
            repaint();                  
  }
};
final timer = new javax.swing.Timer(delay, al);
timer.start();

最新更新