Как заставить зеленый круг намазать? - PullRequest
0 голосов
/ 23 октября 2011

Я пытаюсь сделать простую анимацию, в которой зеленый круг перемещается по диагонали в размазанном узоре на виджете с именем panel, который является экземпляром class MyPanel, который расширяет JPanel.

У JFrame есть кнопка запуска, которая при нажатии должна запускать анимацию путем вызова метода actionPerformed (в котором я вызываю метод animate, который вызывает метод repaint при последовательном увеличениикоординаты x и y круга) в основном классе, который сам является слушателем.

Вместо этого при нажатии кнопки кружок отображается в начальных координатах, а затем, после задержки, другой кружок появляется в конечных координатах.Может кто-нибудь помочь мне понять, где я иду не так?Я новичок в Java, который сделал несколько базовых программ на C лет назад.

Заранее спасибо.Вот мой код:

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

public class Smear implements ActionListener{ 
    JFrame frame; 
    MyPanel panel; 
    JButton button; 
    Smear animgui1; 
    int x=70; 
    int y=70; 

    public static void main(String[] args) { 
        Smear animgui=new Smear(); 
        animgui.project(); 
        animgui.set(animgui); 
    } 

    public void set(Smear anim) { 
        animgui1=anim; 
    } 

    public void project() { 
        frame=new JFrame(); 
        panel=new MyPanel(); 
        button=new JButton("Start"); 
        button.addActionListener(this); 
        frame.getContentPane().add(BorderLayout.NORTH, button); 
        frame.getContentPane().add(BorderLayout.CENTER, panel); 
        frame.setSize(300,300); 
        frame.setVisible(true); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void animate() { 
        while(x!=200) { 
            panel.repaint(); 
            x++; 
            y++; 
            System.out.println("++++"); 
            try { 
                Thread.sleep(50); 
            } 
            catch(Exception ex) {}; 
        } 
    } 

    public void actionPerformed(ActionEvent event) { 
        animgui1.animate(); 
    } 

    class MyPanel extends JPanel { 
        public void paintComponent(Graphics g) { 
            g.setColor(Color.green); 
            g.fillOval(x,y,40,40); 
        } 
    } 
}

Но в то же время я создал другую программу SmearGui без этой кнопки (я удалил код, относящийся к кнопке и слушателю), и он работает так, как задуманок;круг медленно движется в мазке.Код для этого:

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

public class SmearGui{
    JFrame frame;
    MyPanel panel;
    //JButton button;
    SmearGui animgui1;
    int x=70;
    int y=70;

public static void main(String[] args){
        SmearGui animgui=new SmearGui();
        animgui.project();
        animgui.set(animgui);
        animgui.animate();
}
public void set(SmearGui anim){
        animgui1=anim;
}
public void project(){
        frame=new JFrame();
        panel=new MyPanel();
        //button=new JButton("Start");
        //button.addActionListener(this);
        //frame.getContentPane().add(BorderLayout.NORTH, button);
        frame.getContentPane().add(BorderLayout.CENTER, panel);
        frame.setSize(300,300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void animate(){
    while(x!=200){
        panel.repaint();
        x++;
        y++;
        try{
        Thread.sleep(50);
        }
        catch(Exception ex){};
}
}
/*public void actionPerformed(ActionEvent event){
        animgui1.animate();
}*/
  class MyPanel extends JPanel{
      public void paintComponent(Graphics g){
        g.setColor(Color.green);
        g.fillOval(x,y,40,40);
}
}
}

Приведенный выше код помещает метод animate в саму главную.

1 Ответ

1 голос
/ 23 октября 2011
Перерисовка

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...