-3

我已经开始使用 Java 进行编程,但 Swing 有一个问题。单击按钮后,我想重复椭圆动画przycisk。所以这就是为什么我RamkaAnimacjaKola mojeGUI= new RamkaAnimacjaKola();在我的ActionPerformed. 那么我应该改变什么?

我打电话Thread.sleap是因为那是我书中的一个例子。当我尝试只运行我的代码一次时,它会起作用。这意味着没有动作监听器和按钮przycisk源如下:

package Kurs;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class RamkaAnimacjaKola implements ActionListener {

    JFrame ramka;
    Panel mojPanel;

    int x=40;
    int y=40;

    public void zacznijAnimacje(){
        mojPanel = new Panel();
        ramka= new JFrame();
        JButton przycisk= new JButton("repeat");
        ramka.getContentPane().add(BorderLayout.SOUTH, przycisk);
        przycisk.addActionListener(this);
        ramka.getContentPane().add(BorderLayout.CENTER, mojPanel);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.setSize(300, 300);
        ramka.setVisible(true);

        for (int i=0 ; i <40 ;i++){
            x++;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }   
        }
        for (int i=0 ; i <40 ;i++){
            y++;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }
        }
        for (int i=0 ; i <40 ;i++){
            x--;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }
        }
        for (int i=0 ; i <40 ;i++){
            y--;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }
        }
    }

    public void actionPerformed(ActionEvent zdarzenie) {
        RamkaAnimacjaKola mojeGUI= new RamkaAnimacjaKola();
        mojeGUI.zacznijAnimacje();
    }

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

我使用我的测试类开始这段代码:

package Kurs;

public class UruchomGUI {
/**
 * @param args
 */
public static void main(String[] args) {
        RamkaAnimacjaKola mojeGUI = new RamkaAnimacjaKola();
        mojeGUI.zacznijAnimacje();
    }
}

你能解释一下为什么它不起作用吗?

4

1 回答 1

2

您不应该在 Event Dispatching Thread 中执行任何会阻止它的操作。

除其他事项外,EDT 负责处理重绘请求。您所做的任何阻止 EDT 处理这些事件(如Thread.sleep)的操作都会使其显示为您的应用程序已冻结。SO上有很多很好的例子。

看看Multiple bouncing balls thread issueJava Bouncing Ball图像没有加载一些例子......

您可能还想阅读一下Swing 中的并发

于 2013-03-10T09:36:40.477 回答