Я пытаюсь сделать простую анимацию, в которой зеленый круг перемещается по диагонали в размазанном узоре на виджете с именем 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 в саму главную.